运行node.js的两个进程之间的通信

时间:2012-01-22 02:33:56

标签: node.js

我正在编写服务器,并决定在运行node.js的不同进程之间拆分工作,因为我听说node.js是单线程的,并认为这样可以更好地进行并行化。该应用程序将成为一款游戏。我有一个进程提供html页面,然后是其他进程处理玩游戏的客户端之间的通信。客户端将被放入“房间”,然后使用套接字通过服务器中继彼此交谈。我遇到的问题是,html服务器需要知道不同房间的正确放置方式。套接字服务器需要更新此信息,以便保持各个房间的准确表示。所以,据我所知,html服务器和房间服务器需要在内存中共享一些对象。我打算在一台(多核)机器上运行它。有谁知道一个简单的方法来做到这一点?任何帮助将不胜感激

4 个答案:

答案 0 :(得分:2)

Node当前不直接支持共享内存,这反映了JavaScript完全缺乏语义或支持线程/共享内存处理。

对于节点0.7,即使最近才可以通过实验使用,在单个进程中运行多个事件循环和JS上下文的能力已经成为现实(利用V8的isolates概念和对libuv的大量更改以允许多个事件每个进程循环)。在这种情况下,有可能(但仍然没有直接支持或容易)拥有某种共享内存。为了做到这一点,你需要使用一个Buffer或ArrayBuffer(两者都代表JavaScript堆之外的一块内存但可以以有限的方式从中访问)然后以某种方式共享指向底层V8表示的指针异物。我知道它可以从一个最小的本机节点模块完成,但我不确定它是否可以单独使用JS。

无论如何,只需使用child_process.fork并通过提供的通信渠道(使用序列化)发送(看似极少量)数据,就可以最好地实现您描述的方案。

http://nodejs.org/docs/latest/api/child_processes.html

编辑:假设您使用node-ffi弥补差距,那么可以从JS单独使用。

答案 1 :(得分:1)

您可能想尝试使用Redis这样的数据库。您可以让订阅流程的流程在每次需要时都可以监听新连接并从Web服务器发布。 您还可以让多个进程等待用户并使用列表并BRPOP订阅以等待玩家。

答案 2 :(得分:0)

听起来你不想这样做。

服务和消息传递都是IO绑定的,Node非常擅长使用单个线程。如果您需要对这些消息进行长时间运行的计算,那么这些消息可能会分开进行,但即便如此,您可能会对使用单个线程的情况感到惊讶。

如果没有,请看看工人。

答案 3 :(得分:0)

zeromq作为一种进程comm方法也变得非常流行。也许值得一瞧。 http://www.zeromq.org/https://github.com/JustinTulloss/zeromq.node