Deno多worker场景下仅最后一个子worker可向父进程返回消息如何解决
问题根因
你的Worker逻辑本身没有编写错误,出现该现象的核心原因是Deno主进程不会主动等待Worker的异步消息回调执行完成:
- for循环为同步执行逻辑,会快速完成4个Worker的创建、消息发送、监听器绑定操作
- 所有Worker的
message回调属于异步任务,会进入事件队列等待执行 - 同步代码执行完成后,Deno主进程检测不到需要等待的阻塞任务,会提前终止进程,只有最后一个Worker的响应刚好赶在进程退出前触发回调,所以你只能看到最后一条response输出
另外你代码里主进程文件后缀写的main.t属于笔误,修正为main.ts即可正常识别。
修复方案
你可以把每个Worker的执行过程包装成Promise,通过Promise.all等待所有Worker返回结果后再结束主进程,示例修复代码如下:
// 修复后的 main.ts const workerPromises = [] for(let idx = 0; idx < 4; idx++){ const p = new Promise((resolve) => { const worker = new Worker(new URL('./worker.ts', import.meta.url).href, { type: "module", deno: { namespace: true}, }); worker.postMessage({ id: idx, name: 'text1', email: 'ea@da.com' }); worker.addEventListener('message', message => { console.log('response', message.data) worker.terminate() // 主动销毁worker释放资源 resolve(message.data) }) }) workerPromises.push(p) } // 等待所有worker执行完成后再退出主进程 await Promise.all(workerPromises)
如果只是临时验证效果,也可以直接在主进程代码末尾加一行setTimeout(() => {}, 1000),让主进程延迟1秒退出,也能看到所有Worker的响应输出。
内容的提问来源于stack exchange,提问作者Adrian Sanchez
相关产品推荐
相关产品推荐

