如何使用socket.io和node.js执行asynchronous任务?

当我在服务器端收到一个“on”事件时,我想并行地启动一个任务,所以它不会阻塞当前的事件循环线程。 有可能吗? 怎么样?

我不想阻塞服务器端循环,并且我想要在任务完成后能够将消息发送回客户端,比如:

client.on('execute-parallel-task', function(msg) { setTimeout(function() { // do something that takes a while client.emit('finished-that-task'); },0); // this block should return asap, not waiting for the previous call }); 

我不确定setTimeout是否能完成这项工作。

你不需要setTimeout。 执行并行任务完成后,将调用您的函数(msg)。

如果你正在devise一个以asynchronous方式运行的任务,你可以看看node.js的asynchronous库

asynchronous节点JS链接

这取决于需要什么。 如果需要一段时间asynchronous(你可以告诉因为你必须注册一个callback或complete处理程序),并且需要一段时间,因为它被封锁在像IO这样的东西上,而不是CPU绑定,它本质上是并行的

但是,如果它是同步的或者是CPU绑定的,那么你可以使用setTimeoutsetImmediate等来立即发回消息,一旦setTimeout或者setImmediate的处理程序执行,你的单个执行线程就会被卡住。 你并没有真正解决这个问题,只是推迟了这个问题。

为了展示真正的并行行为,你需要启动一个subprocess 。 您可以使用消息传递function来通知您的工作人员要完成哪些工作,并在工作完成后通知父进程。

 var cp = require('child_process'); var child = cp.fork(__dirname + '/my-child-worker.js'); n.on('message', function(m) { if (m === "done") { // Whey! } }); n.send(/* Job id, or something */); 

然后在my-child-worker.js ;

 process.on('message', function (m) { switch (m) { case 'get-x': // blah break; // other jobs } process.send('done'); });