|
7 | 7 | ERROR,
|
8 | 8 | RESULT,
|
9 | 9 | CUSTOM_MESSAGE,
|
| 10 | + WORKER_READY, |
10 | 11 | ParentMessageUnion,
|
11 | 12 | ChildMessageUnion,
|
12 | 13 | } from "./types"
|
@@ -87,6 +88,7 @@ interface IWorkerInfo<T> {
|
87 | 88 | signal: NodeJS.Signals | null
|
88 | 89 | }>
|
89 | 90 | currentTask?: TaskInfo<T>
|
| 91 | + ready: Promise<void> |
90 | 92 | }
|
91 | 93 |
|
92 | 94 | export interface IPublicWorkerInfo {
|
@@ -183,9 +185,13 @@ export class WorkerPool<
|
183 | 185 | silent: options && options.silent,
|
184 | 186 | })
|
185 | 187 |
|
| 188 | + let workerReadyResolve: () => void |
186 | 189 | const workerInfo: IWorkerInfo<keyof WorkerModuleExports> = {
|
187 | 190 | workerId,
|
188 | 191 | worker,
|
| 192 | + ready: new Promise<void>(resolve => { |
| 193 | + workerReadyResolve = resolve |
| 194 | + }), |
189 | 195 | exitedPromise: new Promise(resolve => {
|
190 | 196 | worker.on(`exit`, (code, signal) => {
|
191 | 197 | if (workerInfo.currentTask) {
|
@@ -247,6 +253,8 @@ export class WorkerPool<
|
247 | 253 | for (const listener of this.listeners) {
|
248 | 254 | listener(msg[1] as MessagesFromChild, workerId)
|
249 | 255 | }
|
| 256 | + } else if (msg[0] === WORKER_READY) { |
| 257 | + workerReadyResolve() |
250 | 258 | }
|
251 | 259 | })
|
252 | 260 |
|
@@ -322,14 +330,16 @@ export class WorkerPool<
|
322 | 330 | this.idleWorkers.add(workerInfo)
|
323 | 331 | }
|
324 | 332 |
|
325 |
| - private doWork<T extends keyof WorkerModuleExports>( |
| 333 | + private async doWork<T extends keyof WorkerModuleExports>( |
326 | 334 | taskInfo: TaskInfo<T>,
|
327 | 335 | workerInfo: IWorkerInfo<T>
|
328 |
| - ): void { |
| 336 | + ): Promise<void> { |
329 | 337 | // block worker
|
330 | 338 | workerInfo.currentTask = taskInfo
|
331 | 339 | this.idleWorkers.delete(workerInfo)
|
332 | 340 |
|
| 341 | + await workerInfo.ready |
| 342 | + |
333 | 343 | const msg: ParentMessageUnion = [
|
334 | 344 | EXECUTE,
|
335 | 345 | taskInfo.functionName,
|
|
0 commit comments