【问题标题】:process.send is sync/async on *nix/Windows?process.send 是 *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 之类的?

【问题讨论】:

    标签: node.js express ipc child-process


    【解决方案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 时变为异步"
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2019-01-17
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多