web-dev-qa-db-ja.com

electronフレームワークでは、Webワーカーを介したマルチスレッドが可能ですか?

電子アプリを作成した場合、マルチスレッドをどのように実行するかをグーグルで苦労しています。ウェブワーカーと一緒ですか?

14

レンダラープロセスでは、 Web Workers を作成できます。これらは独自のスレッドで実行されますが、 これらのWeb Workersではノード統合は無効になります Nodeはスレッドセーフではありません。したがって、Nodeを使用する別のスレッドで何かを実行したい場合は、別のプロセスを生成する必要があります。 child_process.fork() そして、 send() を使用して新しいプロセスと通信します。

20
Vadim Macagon

Electron、Node.js、およびプロセス

Electronは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に戻ると、注意すべき概念がいくつかあります。 Electronのプロセスは、2つのフレーバーがあるという点で独特です。

**レンダリングプロセス**-Webページを含むプロセス。これらのプロセスは、一般的なWebページと同様にサンドボックスに作成されます。

**メインプロセス**-アプリケーションをブートストラップするプロセス。レンダリングプロセスとそのWebページを作成します。また、 rpc を介して、生成されたすべてのレンダリングプロセスの通信ハブとして機能することもできます。

こちらが main.js the Electron Tutorial のサンプルの一部。これは、ブラウザウィンドウを呼び出すメインプロセスです。 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には存在せず、electronはNode.js\io.jsおよびChromium上に構築されたフレームワークです。 Electronの基盤はNode.jsです。 node.jsでフォークして子プロセスを生成できます。

13
Terrance

マルチスレッド ドキュメントによると:

Web Workersを使用すると、OSレベルのスレッドでJavaScriptを実行できます。

Nodeのすべての組み込みモジュールがサポートされていますが、Electronの組み込みモジュールまたはネイティブバインディングを持つモジュールは、スレッドセーフに設計されていないため、Web Workersで使用しないでください。

2
Jay

Electron Edgeをご覧ください。これにより、単一プロセスで.NETコードとnode.jsを実行できます(IPCは必要ありません、パフォーマンスが向上します)。これは、.NETのマルチスレッドモデルをシングルスレッドで活用できることを意味します。 node.jsの。

.NET Coreのおかげで、Linux、Mac、Windowsで実行できます。

https://github.com/kexplo/electron-Edge

0
victtim