Electron 多線程

2023-02-16 17:15 更新

通過(guò)Web Workers,可以實(shí)現(xiàn)用操作系統(tǒng)級(jí)別的線程來(lái)跑JavaScript

多線程的Node.js

可以在Electron的Web Workers里使用Node.js的特性。要用的話,需把webPreferences中的nodeIntegrationInWorker選項(xiàng)設(shè)置為true

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

nodeIntegrationInWorker 可以獨(dú)立于nodeIntegration使用,但sandbox必須不能設(shè)置為true

注意: 此選項(xiàng)在 SharedWorker 或 Service Worker 中不可用,因?yàn)樯澈胁呗圆患嫒荨?br>

可用的API

Web Workers支持Node.js的所有內(nèi)置模塊,而且asar檔案也仍通過(guò)Node.js的API來(lái)讀取。 不過(guò)所有的Electron內(nèi)置模塊不可以用在多線程環(huán)境中。

原生Node.js模塊?

在Web Workers里可以直接加載任何原生Node.js模塊,但不推薦這樣做。 大多數(shù)現(xiàn)存的原生模塊是在假設(shè)單線程環(huán)境的情況下編寫的,如果把它們用在Web Workers里會(huì)導(dǎo)致崩潰和內(nèi)存損壞。

請(qǐng)注意, 即使原生Node.js模塊如果考慮到了線程安全問(wèn)題, 但在 Web Worker中加載它仍然不安全, 因?yàn)?nbsp;process.dlopen 函數(shù)并沒有考慮線程安全。

現(xiàn)在安全順利地加載原生模塊的唯一辦法,就是確保在Web Workers啟動(dòng)后app不加載原生模塊。

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)