Skip to main content

멀티스레딩

Web Workers를 사용하면 운영체제 수준의 스레드에서 자바스크립트를 실행할 수 있다.

멀티스레드 Node.js

Electron의 Web Workers에서 Node.js 기능을 사용할 수 있다. 이를 위해 webPreferences에서 nodeIntegrationInWorker 옵션을 true로 설정해야 한다.

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

nodeIntegrationInWorkernodeIntegration과 독립적으로 사용할 수 있지만, sandboxtrue로 설정해서는 안 된다.

참고: 이 옵션은 샌드박싱 정책의 호환성 문제로 인해 SharedWorkerService 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')