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

时间:2013-05-26 21:01:31

标签: node.js socket.io

当我在服务器端收到“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是否可以完成这项工作。

2 个答案:

答案 0 :(得分:2)

这取决于需要一段时间。如果它需要一段时间异步(你可以告诉,因为你必须注册一个回调或complete处理程序),并且需要一段时间因为它被阻止了像IO这样的东西,而不是CPU绑定,它本身就是 parallel

但是,如果它是setTimeout或{{1}的处理程序,那么您可以使用setImmediatesetTimeout等立即发回消息。执行时,你的单个执行线程将被卡住处理;你不是真的修复问题,只是推迟了。

要展示真正的并行行为,您需要启动child process。您可以使用消息传递功能通知您的工作人员要做什么工作,并在工作完成后通知父进程。

setImmediate

然后在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

答案 1 :(得分:1)

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

如果您要设计一个以异步方式运行的任务,您可以查看类似于node.js的异步库

Async Node JS Link