我有一个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事件是否更适合此模式?

#1楼 票数:0

在nodejs文档中很明显,您只应在exit事件中执行同步操作。 这是exit事件文档摘录:

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

因此,在退出事件中执行异步操作可能是一种错误处理,这将取决于内部实现及其是否需要事件循环才能起作用。


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

当Node.js清空其事件循环且没有其他工作可安排时,将发出'beforeExit'事件。 通常,没有安排任何工作时,Node.js进程将退出,但是在“ beforeExit”事件上注册的侦听器可以进行异步调用,从而导致Node.js进程继续进行。

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

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

除非打算安排其他工作,否则不应将“ beforeExit”用作“ exit”事件的替代方法。

  ask by 90932e8 translate from so

未解决问题?本站智能推荐:

1回复

node.js产生。 退出事件立即触发

我正在将spawn函数与mjpg_streamer一起使用。 但是,子进程只会在创建后立即退出。 这是我正在使用的代码 运行实际命令本身将返回以下内容: mjpg_streamer命令本质上的作用是启动Web服务器。 退出回调中的代码为1,信号为null 。 不太确定
3回复

Node.js 将带有函数定义的对象发送到工作线程

所以我正在 Node.js 中处理一个项目,我想打开一些额外的线程来更有效地处理处理负载。 但是我使用带有函数定义的类,当我尝试将这些对象发送到工作线程时,对象中定义的函数消失了,我只剩下对象中的其他字段。 有没有办法向工作人员发送一个对象并保留这些功能,以便可以在工作人员内调用它们?
1回复

Redis中持久队列的工作人员管理

使用LPUSH和BRPOPLPUSH ( http://redis.io/commands/rpoplpush )在Redis中实现持久队列是一种众所周知的模式。 但是,为了扩大规模,设计需要满足来自主任务队列中BRPOPLPUSH多个工作人员/消费者的需求。 因此,规范似乎是每个工人都
1回复

正常关闭Node.js工作者

据的NodeJS文档 child.disconnect()关闭子进程(工人) 优雅 。 这是否意味着在触发server.close()之前,工作人员会仔细考虑所有异步回调,打开的数据库连接和当前活动的http请求? 如果不是,那么正常关闭Web Worker的正确方法是什么?
1回复

用于node.js的Heroku工作人员

我从Heroku开始,我有一个Web应用程序,该应用程序的一部分需要每周(最好是星期一)运行一次。 我一直在读一些关于工人的文章: 这里 , 这里和这里 ……但是我仍然有很多疑问: 1)这名工人在没有严格控制的情况下在后台运行,因此无法安排每周运行一次。 还是我错了? 如果我错了,我
3回复

在heroku上的node.js中开发一个时钟和工作者

我正在开发一种服务,需要每五分钟为不同的用户分析来自社交媒体网络的数据。 我正在node.js中开发它,我将在Heroku上实现它。 根据Heroku网站上的这篇文章 ,最好的方法是将调度程序的逻辑与工作者的逻辑分开。 实际上,我们的想法是让一个dyno致力于安排任务以避免重复。 这
1回复

使用 worker 启动 Node.js 项目

我需要使用工作脚本运行节点 js 项目 我的文件夹结构如下 在我的包 json 文件中给出这样的 工人.js 我正在通过“npm start”启动我的项目,这里 app.js 文件正在运行,但我的工作人员没有启动。 我不确定这是与应用程序一起启动工作程序项目的方式。 非常感谢您的帮助。
1回复

使用Node.js的峰值负载

我正在使用Node.js,socket.io和express模块​​创建一个Web应用程序。 我想找出有关服务器峰值负载的信息。 每个用户每秒发出5-7个请求。 服务器:RAM 2GB CPU 2x2 GHz 该服务器可以处理多少个连接? 是否需要使用Web Workers?