Skip to content

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.