在node.js中进行长时间运行的计算

14

我正在使用Node.js编写游戏服务器,其中部分操作需要在服务器上进行大量计算。我不希望在运行这些计算时停止接受连接,但是由于Node.js不支持线程,所以该怎么办才能在后台运行这些计算呢?

3个回答

13

个人无法保证这两个工具的可靠性,但如果你一心想在进程内完成工作,那么 Node 模块页面上列出了一些独立实现 WebWorkers API 的库:

  • http://github.com/cramforce/node-worker
  • http://github.com/pgriess/node-webworker

初看起来,第二个库更加成熟,这两个库都允许您基本上进行线程编程,但实际上使用的是Actor模型,因此所有操作都需要通过消息传递完成,您不能共享数据结构等。

另外值得一提的是,Node.js团队计划最终本地实现该API,因此即使这些工具不完美,也可能是一个不错的临时措施。


2
当我问Ryah这个问题时,他建议使用node-webworker :) - nornagon
最近有人尝试解决这个问题,提到了http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html。 - BigbangO
另一篇处理此问题的博客文章:http://neilk.net/blog/2013/04/30/why-you-should-use-nodejs-for-CPU-bound-tasks/ - loveNoHate

4
var spawn = require('child_process').spawn;
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need

//then you can attach events to that list like this
listorwhatev.on('exit', function(code){});

///or in this ls example as it streams info
listorwhatev.stdout.on('data', function(info){sys.puts(info);});

确保每个应用程序只出现一次生成进程,然后将内容输入并针对每个连接监视其事件。 在处理之前,您还应检查listorwhatev是否仍在运行。我们都喜欢那些未捕获的错误,在节点崩溃应用程序时,不是吗;) 当通过kill或者发生了一些不好的事情导致生成(pid)退出时,如果您没有在代码中优雅地退出生成,则流事件处理程序会使应用程序崩溃。


我将会来回传递数兆字节的数据;stdout/stdin 不太感觉最佳... - nornagon

1

有些操作需要服务器进行大量计算。

你是如何编写计算密集型代码的呢?这在node.js中非常困难。

当node.js不支持线程时,我该如何在后台运行它们呢?

你可以生成几个worker(node)实例,并使用例如redis阻塞弹出与接受连接(node实例)进行通信。Node.js redis库是非阻塞的。


这并不难。我正在循环遍历一个大小为128x128x128 = 200万块或更大的游戏地图并计算一些东西。 - nornagon
这种方法应该可行。你应该通过消息传递(阻塞列表操作)进行一些分治。 - Alfred
是的,Redis不适合存储这些数据 :) - nornagon
就像我之前说的那样,你可以使用Redis作为进程间通信的工具。Redis使这个过程变得非常简单和快速。如果可能的话,将数据存储在Redis中会是一个优点,但并非必须。 - Alfred
我认为Alfred所指的是redis的发布/订阅方面,http://code.google.com/p/redis/wiki/PublishSubscribe 我和OP有类似的问题,我的工作节点通过套接字进行通信,所以我可能会转向redis。感谢您指出这一点,Alfred! - rem7
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接