codecamp

Electron 多线程

通过Web Workers,可以实现用操作系统级别的线程来跑JavaScript

多线程的Node.js

可以在Electron的Web Workers里使用Node.js的特性。要用的话,需把webPreferences中的nodeIntegrationInWorker选项设置为true

const win = new BrowserWindow({
  webPreferences: {
    nodeIntegrationInWorker: true
  }
})

nodeIntegrationInWorker 可以独立于nodeIntegration使用,但sandbox必须不能设置为true

注意: 此选项在 SharedWorker 或 Service Worker 中不可用,因为沙盒策略不兼容。

可用的API

Web Workers支持Node.js的所有内置模块,而且asar档案也仍通过Node.js的API来读取。 不过所有的Electron内置模块不可以用在多线程环境中。

原生Node.js模块

在Web Workers里可以直接加载任何原生Node.js模块,但不推荐这样做。 大多数现存的原生模块是在假设单线程环境的情况下编写的,如果把它们用在Web Workers里会导致崩溃和内存损坏。

请注意, 即使原生Node.js模块如果考虑到了线程安全问题, 但在 Web Worker中加载它仍然不安全, 因为 process.dlopen 函数并没有考虑线程安全。

现在安全顺利地加载原生模块的唯一办法,就是确保在Web Workers启动后app不加载原生模块。

process.dlopen = () => {
  throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')


Electron Dock
Electron 原生文件拖 & 放
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }