在Electron中使用Worker thread
1/17/2021, 8:13:11 AM

Electron的main process本质就是一个NodeJS进程。由于NodeJS是 单线程模型,如果一个Electron应用需要起一个HTTP Server或是执行 大量的CPU密集操作,最好使用多线程。所幸,NodeJS已经提供了一个 多线程方案——worker_threads内部模块。下面记录一下在Electron中 使用其的方法和坑点。

参考

使用

和普通的NodeJS一样。

const worker = new Worker(WORKER_PATH, {
  ...options
})

需要特别注意的是,在worker_thread无法使用electron模块

坑点: electron asar

如果WORKER_PATH是一个asar包中的文件,会报错File not found。原因是Electron的asar只对fs模块打了补丁。

解决方法:(electron-builder)

  1. 显式指定:"asar": false,不打包。
  2. 使用asarUnpack,参见electron-builder docs

坑点: electron-webpack

从哪里加载Worker Script???

解决方法:

  1. 增加下列webpack配置:
// webpack.main.js
const path = require('path')

const root = path.resolve(__dirname, '..')
const srcMain = path.join(root, 'src', 'main')

module.exports = {
  entry: {
    'worker.api': path.join(srcMain, 'workers', 'api.ts'),
    'worker.scanner': path.join(srcMain, 'workers', 'scanner.ts'),
    'worker.sync': path.join(srcMain, 'workers', 'sync.ts')
  }
}
  1. 用下列代码计算路径:
const workerName = WORKER_NAME
const workerPath = isDevelopment
  ? path.resolve(PROJECT_ROOT, 'dist', 'main')
  : __dirname