Разрешает ли электронная структура многопоточность через веб-работников?
Мне трудно гуглить, как бы я делал многопоточность, если бы сделал электронное приложение. Будет ли это с веб-работниками?
4 ответа
В процессе рендеринга вы можете создавать Web Workers, и они будут работать в своих собственных потоках, однако интеграция Node в этих Web Workers будет отключена, потому что Node не является поточно-ориентированным. Так что если вы хотите запустить что-то в отдельном потоке, который использует Node, то вам нужно будет запустить отдельный процесс, вы можете сделать это с child_process.fork()
а затем общаться с новым процессом, используя send()
,
Об электроне, Node.js и процессах
Электрон работает по тем же принципам, что и Node. В node.js потоки не являются атомарной единицей исполнения. Вы работаете в цикле обработки событий и по умолчанию выполняется асинхронно. Смотрите здесь для деталей. При этом вы можете раскрутить несколько дочерних процессов в node.js, разветвив их.
Вот пример.
//forking a process using cluster
var cluster = require('cluster');
var http = require('http');
var numCPUs = 4;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end('process ' + process.pid + ' says hello!');
}).listen(8000);
}
Благодарим Вас за создание кластера node.js для ускорения работы ваших приложений. для примера.
Электронно-специфические концепции
Возвращаясь к Электрону, есть пара дополнительных понятий, о которых нужно знать. Процессы в Electron уникальны тем, что они бывают двух видов.
** Render Process ** - Процесс, который содержит веб-страницу. Эти процессы создаются в песочнице, как и типичные веб-страницы.
** Основной процесс ** - процесс, который загружает ваше приложение. Он создает процессы рендеринга и их веб-страницы. Он также может выступать в качестве коммуникационного хаба для всех порожденных процессов рендеринга через rpc.
Вот часть main.js из учебника по электронам. Это основной процесс, вызывающий окно браузера. Обратите особое внимание на mainWindow
переменная.
'use strict';
const electron = require('electron');
const app = electron.app; // Module to control application life.
const BrowserWindow = electron.BrowserWindow; // Module to create native browser window.
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
var mainWindow = null;
// Quit when all windows are closed.
app.on('window-all-closed', function() {
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform != 'darwin') {
app.quit();
}
});
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
app.on('ready', function() {
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600});
// and load the index.html of the app.
mainWindow.loadURL('file://' + __dirname + '/index.html');
// Open the DevTools.
mainWindow.webContents.openDevTools();
// Emitted when the window is closed.
mainWindow.on('closed', function() {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null;
});
});
TL; DR;
Потоки не существуют в Node.js, а электрон - это фреймворк, построенный на Node.js\io.js и Chromium. Основой Electron является Node.js. Вы можете порождать дочерние процессы с разветвлением в node.js.
Согласно многопоточным документам:
С помощью Web Workers можно запускать JavaScript в потоках уровня ОС.
Поддерживаются все встроенные модули Node, однако ни один из встроенных модулей Electron или модулей с собственными привязками не должен использоваться в Web Workers, так как они не предназначены для работы с потоками.
Проверьте Электронный Край. Это позволяет вам запускать.NET-код и node.js в одном процессе (не требуется IPC, повышается производительность). Это означает, что вы можете использовать многопоточную модель.NET с однопоточностью node.js.
Он будет работать на Linux, Mac и Windows, благодаря.NET Core.