-// Partial Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+// Partial Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
import { EventEmitterAsyncResource } from 'node:events'
import { SHARE_ENV, Worker } from 'node:worker_threads'
throw new RangeError('Elements per worker must be greater than zero')
}
this.workerSet = new Set<WorkerSetElement>()
- if (this.workerOptions.poolOptions?.enableEvents != null) {
+ if (this.workerOptions.poolOptions?.enableEvents === true) {
this.emitter = new EventEmitterAsyncResource({ name: 'workerset' })
}
this.started = false
version: workerSetVersion,
type: 'set',
worker: 'thread',
+ started: this.started,
size: this.size,
elementsExecuting: [...this.workerSet].reduce(
(accumulator, workerSetElement) => accumulator + workerSetElement.numberOfWorkerElements,
public async stop (): Promise<void> {
for (const workerSetElement of this.workerSet) {
const worker = workerSetElement.worker
- const waitWorkerExit = new Promise<void>((resolve) => {
+ const waitWorkerExit = new Promise<void>(resolve => {
worker.once('exit', () => {
resolve()
})
})
+ worker.unref()
await worker.terminate()
await waitWorkerExit
- this.emitter?.emit(WorkerSetEvents.stopped, this.info)
- this.emitter?.emitDestroy()
- this.emitter?.removeAllListeners()
- this.started = false
}
+ this.emitter?.emit(WorkerSetEvents.stopped, this.info)
+ this.started = false
+ this.emitter?.emitDestroy()
+ this.emitter?.removeAllListeners()
}
/** @inheritDoc */
if (!this.started) {
throw new Error('Cannot add a WorkerSet element: not started')
}
- if (this.workerSet == null) {
- throw new Error("Cannot add a WorkerSet element: 'workerSet' property does not exist")
- }
const workerSetElement = await this.getWorkerSetElement()
workerSetElement.worker.postMessage({
- event: WorkerMessageEvents.startWorkerElement,
+ event: WorkerMessageEvents.addWorkerElement,
data: elementData
})
++workerSetElement.numberOfWorkerElements
})
worker.on('message', this.workerOptions.poolOptions?.messageHandler ?? EMPTY_FUNCTION)
worker.on('message', (message: WorkerMessage<WorkerData>) => {
- if (message.event === WorkerMessageEvents.startedWorkerElement) {
- this.emitter?.emit(WorkerSetEvents.elementStarted, this.info)
- } else if (message.event === WorkerMessageEvents.startWorkerElementError) {
+ if (message.event === WorkerMessageEvents.addedWorkerElement) {
+ this.emitter?.emit(WorkerSetEvents.elementAdded, this.info)
+ } else if (message.event === WorkerMessageEvents.workerElementError) {
this.emitter?.emit(WorkerSetEvents.elementError, message.data)
}
})
worker.on('error', this.workerOptions.poolOptions?.errorHandler ?? EMPTY_FUNCTION)
- worker.on('error', (error) => {
+ worker.on('error', error => {
this.emitter?.emit(WorkerSetEvents.error, error)
if (
this.workerOptions.poolOptions?.restartWorkerOnError === true &&
) {
this.addWorkerSetElement()
}
+ worker.unref()
+ worker.terminate().catch(error => this.emitter?.emit(WorkerSetEvents.error, error))
})
worker.on('online', this.workerOptions.poolOptions?.onlineHandler ?? EMPTY_FUNCTION)
worker.on('exit', this.workerOptions.poolOptions?.exitHandler ?? EMPTY_FUNCTION)