【问题标题】:Node.js send message from worker on exit eventNode.js 在退出事件时从工作人员发送消息
【发布时间】:2019-09-18 22:04:49
【问题描述】:

我有一个 Node 应用程序,它通过 fork() 创建了许多工作进程来自己执行一些任务。作为副产品,工作人员会生成以对象形式执行的操作的快照。每个工作人员都有一个附加到“退出”事件的事件侦听器,此时他们通过process.send() 将其快照发送回父进程。

这是一个设置示例:

// parent.js
const exec = require('child_process');

const worker = exec.fork('worker.js', [], {
  stdio: ['pipe', 'pipe', null, 'ipc']
});

worker.on('message', (snapshot) => {
  // Handle the snapshot sent from worker
});
// worker.js
process.on('exit', () => {
  process.send({ /* snapshot data */ })
});
/* Arbitrary task work */

这对于父母/员工 IPC 来说是可接受的模式吗?具体来说,考虑到exit 事件和process.send() 的性质,这对于在父进程中接收消息的可靠性是否可靠?

beforeExit 事件是否更适合这种模式?

【问题讨论】:

    标签: node.js design-patterns ipc worker


    【解决方案1】:

    在 nodejs 文档中很清楚你应该只在退出事件中执行同步操作。这是doc for the exit event的摘录:

    监听函数只能执行同步操作。 Node.js 进程将在调用 'exit' 事件侦听器后立即退出,从而导致放弃仍在事件循环中排队的任何其他工作。

    因此,在退出事件中执行异步操作可能是一个废话,这将取决于内部实现以及它是否需要事件循环才能工作。


    您可以在 beforeExit 事件中执行异步操作,因此您可能应该这样做。摘自beforeExit doc

    'beforeExit' 事件在 Node.js 清空其事件循环并且没有其他工作要安排时发出。通常情况下,Node.js 进程会在没有安排工作时退出,但是注册在 'beforeExit' 事件上的监听器可以进行异步调用,从而导致 Node.js 进程继续运行。

    使用 process.exitCode 的值作为唯一参数调用侦听器回调函数。

    对于导致显式终止的条件,例如调用 process.exit() 或未捕获的异常,不会发出 'beforeExit' 事件。

    'beforeExit' 不应用作 'exit' 事件的替代,除非打算安排额外的工作。

    【讨论】:

    • 我已经通读了文档,但找不到什么——也许这应该在原始帖子中更清楚地说明——process.send 是异步的吗?我唯一关心的是消息是发送的,而不是是否收到(从工人的角度来看)。我认为它类似于 HTTP 请求,这样比较合理吗?
    • @aahanson - 它有一个完成回调。这是你的线索,它是异步的。正如我所说,它可能会或可能不会起作用。我建议使用beforeExit
    猜你喜欢
    • 2016-05-29
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2021-02-07
    • 2012-04-20
    • 2012-01-07
    相关资源
    最近更新 更多