簡體   English   中英

NodeJS 工作線程和 AWS Lambda:不一致 Output

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM