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

时间:2010-09-28 01:55:07

标签: multithreading backgroundworker node.js

我正在node.js中编写游戏服务器,有些操作涉及部分服务器的大量计算。我不想在运行这些计算时停止接受连接 - 当node.js不支持线程时,如何在后台运行它们?

3 个答案:

答案 0 :(得分:13)

我个人无法担保这两种情况,但是如果你一心想做正在进行的工作,那么有一些WebWorkers API for node的独立实现,如上所列节点模块页面:

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

乍一看,第二个看起来更成熟,这些都可以让你基本上做线程编程,但它基本上是actor模型,所以这一切都是通过消息传递完成的,你不能拥有共享数据结构或任何东西。

此外,对于它的价值,node.js团队打算最终本地实现这个API,所以这些工具,即使它们并不完美,也可能是一个不错的权宜之计。

答案 1 :(得分: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);});

确保每个应用程序出现一次spawn进程,然后将内容提供给它并观察每个连接的事件。 你还应该在处理之前检查listorwhatev是否仍在运行。因为我们都喜欢节点崩溃的那些未被捕获的错误应用程序不是我们;) 当spawn(pid)退出时,虽然你的机器上发生了一次重击或者一些不好的事情,并且你没有优雅地退出代码中的spawn,你的流事件处理程序将使你的应用程序崩溃。

答案 2 :(得分:1)

  

并且一些操作涉及沉重   在部分服务器上进行计算

你是如何编写首先计算量大的代码的。这在node.js中很难做到。

  

如何在后台运行它们   当node.js不支持线程时

您可以使用例如redis blocking pop来生成几个worker(节点)实例并与接受连接(节点实例)进行通信。 Node.js redis库没有阻塞。