process.send 是 *nix/Windows 上的同步/异步?

Posted

技术标签:

【中文标题】process.send 是 *nix/Windows 上的同步/异步?【英文标题】:process.send is sync/async on *nix/Windows? 【发布时间】:2016-01-06 07:11:38 【问题描述】:

我有一个分叉 N 个子进程的 Node.js 进程(不是服务器)。 在某个时候,可能会有超过 50 个 CP。所以我开始想,如果 process.send (IPC) 真的阻塞了,那么这可能是每个 CP 所经历的巨大损失。因为在我的程序中发生的是每个 CP 使用 process.send 向单个父进程发送消息,以便父​​进程进行日志记录,从而同步日志记录。但是如果 process.send 阻塞,那么在某些时候父进程可能会成为瓶颈。

所以问题是 - Node.js IPC 在 *nix 和 Windows 上是阻塞还是非阻塞?如果它是阻塞的,如果我或其他人真的想要异步 IPC,我应该使用消息队列还是 ZeroMQ 之类的?

【问题讨论】:

【参考方案1】:

进程发送已设置为异步,见https://github.com/nodejs/node/commit/56d9584a0ead78874ca9d4de2e55b41c4056e502

"`ChildProcess.prototype.send()` and `process.send()` used to operate
synchronously but became asynchronous in commit libuv/libuv@393c1c5"

这是由于 libuv 代码的更改;它有一些缺点,但如果您担心父进程会成为瓶颈,您可以改用管道进行通信。

50 个 CP 不会有问题,但可能有 500 个,具体取决于您的体系结构和消息的大小。那时我会推荐一个更花哨的消息队列。 ZeroMQ 或普通 redis 应该可以工作。

【讨论】:

实际上,如果您阅读 Github 链接,它会说 process.send 已设置为异步,而不是同步,这是个好消息 "ChildProcess.prototype.send()process.send() 曾经同步操作,但在提交 libuv/libuv@393c1c5 时变为异步"

以上是关于process.send 是 *nix/Windows 上的同步/异步?的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中使用 Jasmine 测试子 process.send

作业完成时的 Kue 回调

通过 npm 脚本生成时从子进程向父进程发送消息

Orbeon Forms - 处理服务响应

Orbeon 表单:单击“提交”后禁用表单字段

监听主进程的 HTTP 流量,处理子进程的连接?