You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:18:02