Les étapes de la démonstration
Sur cette démonstration, nous verrons comment fonctionne la communication entre un processus enfant et le processus principal.
Voici les différents fichiers de la démo :
js
import {isMainThread, Worker} from 'worker_threads'
import * as url from 'url'
import log from 'fancylog'
const __filename = url.fileURLToPath(import.meta.url)
if (isMainThread) {
const worker = new Worker(__filename)
worker.on('message', (msg) => {
log.info({
event: 'main.message',
message: `Main received message`,
type: msg.type,
data: msg.chunk
})
})
worker.on('error', (error) => {
log.error({
event: 'main.error',
message: `Main received error`,
error: error.message,
})
})
worker.on('exit', (code) => {
log.info(code)
})
worker.postMessage({
hello: 'world'
})
} else {
import('./worker.js')
}
js
import {parentPort} from 'worker_threads'
import log from 'fancylog'
parentPort.on('message', (data) => {
log.info({
event: 'worker.message',
message: `Worker received message ${data.hello}`,
data
})
let i = 0
setInterval(() => {
parentPort.postMessage({type: 'chunk', chunk: `hello ${i++}`})
}, 1000)
})
Voir le code complet
Usage
sh
cd packages/spawn
yarn start
Note
Cette démonstration tente d'utiliser au maximum les API Node.js et ne nécessite pas de dépendances externes. Vous verrez que le code est assez simple et facile à comprendre, mais qu'il manque de fonctionnalités pour être utilisé en production.