我正在node.js中编写游戏服务器,有些操作涉及部分服务器的大量计算。我不想在运行这些计算时停止接受连接 - 当node.js不支持线程时,如何在后台运行它们?
答案 0 :(得分:13)
我个人无法担保这两种情况,但是如果你一心想做正在进行的工作,那么有一些WebWorkers API for node的独立实现,如上所列节点模块页面:
乍一看,第二个看起来更成熟,这些都可以让你基本上做线程编程,但它基本上是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库没有阻塞。