我正在使用Node.js编写游戏服务器,其中部分操作需要在服务器上进行大量计算。我不希望在运行这些计算时停止接受连接,但是由于Node.js不支持线程,所以该怎么办才能在后台运行这些计算呢?
我正在使用Node.js编写游戏服务器,其中部分操作需要在服务器上进行大量计算。我不希望在运行这些计算时停止接受连接,但是由于Node.js不支持线程,所以该怎么办才能在后台运行这些计算呢?
个人无法保证这两个工具的可靠性,但如果你一心想在进程内完成工作,那么 Node 模块页面上列出了一些独立实现 WebWorkers API 的库:
初看起来,第二个库更加成熟,这两个库都允许您基本上进行线程编程,但实际上使用的是Actor模型,因此所有操作都需要通过消息传递完成,您不能共享数据结构等。
另外值得一提的是,Node.js团队计划最终本地实现该API,因此即使这些工具不完美,也可能是一个不错的临时措施。
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)退出时,如果您没有在代码中优雅地退出生成,则流事件处理程序会使应用程序崩溃。
有些操作需要服务器进行大量计算。
你是如何编写计算密集型代码的呢?这在node.js中非常困难。
当node.js不支持线程时,我该如何在后台运行它们呢?
你可以生成几个worker(node)实例,并使用例如redis阻塞弹出与接受连接(node实例)进行通信。Node.js redis库是非阻塞的。