![](/img/trans.png)
[英]AWS Lambda functions NodeJs for postgreSQL - timeout error
[英]NodeJS Worker Threads and AWS Lambda: Inconsistent Output
我正在嘗試執行以下 AWS lambda:
索引.js:
const test = require("test");
exports.handler = async (event) => {
await test.main();
};
測試.js:
const {Worker} = require("worker_threads");
const main = () => {
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);
});
worker.on("exit", exitCode => {
console.log(exitCode);
});
console.log("I am here!");
}
exports.main = main;
工人.js:
const {parentPort, workerData} = require("worker_threads");
const getSum = (num1, num2) => {
return num1 + num2;
}
parentPort.postMessage(getSum(workerData.num1, workerData.num2));
當我在筆記本電腦上運行相同的程序時,它工作正常。 我始終看到工作線程的 output。
Output 在我的筆記本電腦上:
❯ node index.js
I am here!
10 + 20 is 30
0
Output 在 lambda 上:
START RequestId: c178d74b-da57-4765-9fa7-77d3fc83d645 Version: $LATEST
2021-08-31T14:33:37.353Z c178d74b-da57-4765-9fa7-77d3fc83d645 INFO I am here!
END RequestId: c178d74b-da57-4765-9fa7-77d3fc83d645
REPORT RequestId: c178d74b-da57-4765-9fa7-77d3fc83d645 Duration: 2.12 ms Billed Duration: 3 ms Memory Size: 10240 MB Max Memory Used: 108 MB
當我運行 lambda 時,output 非常隨機。 有時我會看到工作線程的 output,而其他時候則看不到。
為什么在 AWS lambda 和我的筆記本電腦上執行該程序會有所不同?
您無需等待 worker 異步操作在test.js
文件中完成。 嘗試添加一個 promise,它會在 worker 完成時解析。 像這樣:
const { Worker } = require("worker_threads");
const main = async () => {
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);
});
console.log("I am here!");
// Awaiting for the worker to finish here
return new Promise((resolve) => {
worker.on("exit", (exitCode) => {
console.log(exitCode);
resolve();
});
});
};
exports.main = main;
或者,您可以設置context.doNotWaitForEmptyEventLoop = false
但不建議這樣做,因為它容易出錯且難以調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.