NodeJS Worker Threads在AWS Lambda上输出不一致问题咨询
问题原因
- 你代码中的
test.main()是普通同步函数,没有返回Promise,即使handler里写了await test.main()也不会等待worker线程执行完成,handler会立刻执行完成。 - 本地Node.js进程的退出逻辑是等待事件循环中所有待处理任务全部执行完毕才会退出,worker线程的
message、exit回调属于待处理异步任务,Node会等这些回调执行完再退出,所以本地运行始终能看到完整输出。 - AWS Lambda的执行逻辑完全不同:只要handler函数完成返回(不管同步返回还是异步resolve),就会立刻冻结整个执行环境,还没执行完的worker线程、未触发的回调都会被直接暂停,不会继续执行。你看到的随机输出就是概率问题:如果worker的回调刚好在handler返回前执行完成,就能看到日志,否则就看不到。
修复方案
把main函数改造为返回Promise,等待worker执行完成后再resolve,这样handler的await就会等worker逻辑全部执行完才结束:
const {Worker} = require("worker_threads"); const main = () => { return new Promise((resolve, reject) => { let num1 = 10; let num2 = 20; const worker = new Worker("./worker.js", {workerData: {num1, num2}}); worker.on("message", result => { console.log(`${num1} + ${num2} is ${result}`); }); worker.on("error", error => { console.log(error); reject(error); }); worker.on("exit", exitCode => { console.log(exitCode); resolve(); }); console.log("I am here!"); }) } exports.main = main;
内容的提问来源于stack exchange,提问作者Vineeth Penugonda
相关产品推荐
相关产品推荐

