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 上的同步/异步?的主要内容,如果未能解决你的问题,请参考以下文章