멀티스레딩
Web Workers를 사용하면 운영체제 수준의 스레드에서 자바스크립트를 실행할 수 있다.
멀티스레드 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 모듈
네이티브 Node.js 모듈은 Web Worker에서 직접 로드할 수 있지만, 이 방법은 권장하지 않는다. 대부분의 기존 네이티브 모듈은 단일 스레드 환경을 가정하고 작성되었기 때문에, Web Worker에서 사용하면 충돌이나 메모리 손상이 발생할 수 있다.
네이티브 Node.js 모듈이 스레드 안전(thread-safe)하더라도 Web Worker에서 로드하는 것은 여전히 안전하지 않다. process.dlopen
함수가 스레드 안전하지 않기 때문이다.
현재로서는 Web Worker가 시작된 후에 네이티브 모듈을 로드하지 않도록 하는 것이 안전한 유일한 방법이다.
process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')