* Constructs a new worker node.
*
* @param type - The worker type.
- * @param filePath - The worker file path.
+ * @param filePath - Path to the worker file.
* @param opts - The worker node options.
*/
constructor (type: WorkerType, filePath: string, opts: WorkerNodeOptions) {
}
/** @inheritdoc */
- public closeChannel (): void {
- if (this.messageChannel != null) {
- this.messageChannel.port1.unref()
- this.messageChannel.port2.unref()
- this.messageChannel.port1.close()
- this.messageChannel.port2.close()
- delete this.messageChannel
+ public async terminate (): Promise<void> {
+ const waitWorkerExit = new Promise<void>(resolve => {
+ this.registerOnceWorkerEventHandler('exit', () => {
+ resolve()
+ })
+ })
+ this.closeMessageChannel()
+ this.removeAllListeners()
+ if (this.info.type === WorkerTypes.thread) {
+ await this.worker.terminate?.()
+ } else if (this.info.type === WorkerTypes.cluster) {
+ this.registerOnceWorkerEventHandler('disconnect', () => {
+ this.worker.kill?.()
+ })
+ this.worker.disconnect?.()
}
+ await waitWorkerExit
}
/** @inheritdoc */
public registerWorkerEventHandler (
event: string,
- listener:
+ handler:
| OnlineHandler<Worker>
| MessageHandler<Worker>
| ErrorHandler<Worker>
| ExitHandler<Worker>
): void {
- this.worker.on(event, listener)
+ this.worker.on(event, handler)
}
/** @inheritdoc */
public registerOnceWorkerEventHandler (
event: string,
- listener:
+ handler:
| OnlineHandler<Worker>
| MessageHandler<Worker>
| ErrorHandler<Worker>
| ExitHandler<Worker>
): void {
- this.worker.once(event, listener)
+ this.worker.once(event, handler)
}
/** @inheritdoc */
return this.taskFunctionsUsage.delete(name)
}
+ private closeMessageChannel (): void {
+ if (this.messageChannel != null) {
+ this.messageChannel.port1.unref()
+ this.messageChannel.port2.unref()
+ this.messageChannel.port1.close()
+ this.messageChannel.port2.close()
+ delete this.messageChannel
+ }
+ }
+
private initWorkerInfo (worker: Worker): WorkerInfo {
return {
id: getWorkerId(worker),