2013-05-26 29 views
1

当我在服务器端收到一个“on”事件时,我想并行地启动一个任务,所以它不会阻塞当前的事件循环线程。是否有可能这样做?怎么样?如何使用socket.io和node.js执行异步任务?

我不想阻止服务器端循环,我希望能够发回信息给客户端,一旦任务完成,一些诸如:

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将完成这项工作。

回答

1

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

,如果你正在设计以异步方式运行任务,你可以看看像异步lib中的node.js

Async Node JS Link

+0

我可以使用async.parallel没有问题,但服务器将回答其他请求,而我的(做一些需要一段时间)正在运行?它会同时运行两个代码吗? –

+0

是的,这就是异步的工作方式......它基本上是一个线程(你在node.js中没有线程)......每当有一部分正在等待发生的事情时,其他代码就会运行,并且当发生事件时会调用一个事件正确的处理程序处理它.. http://stevehanov.ca/blog/index.php?id=12 –

+0

如果你需要线程模型,你可能已经选择了worng技术为你的后端...有多个进程之间进行沟通不像线程那样高效..事实上,你会创建使用进程的线程==更高的开销,更多的复杂性,没有支付.. –

2

这取决于什么需要一段时间是。如果需要异步处理(因为必须注册回调函数或complete处理程序),而需要一段时间,因为它被阻塞在IO之类的东西上,而不是CPU绑定,它本质上会成为平行

但是,如果它的东西同步或CPU的约束,而你可以使用setTimeoutsetImmediate等立即发回的消息,一旦处理程序setTimeoutsetImmediate执行,你执行一个线程将被固定在处理那些;你不是真的修复的问题,只是推迟它。

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

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'); 
}); 
+0

子进程看起来很完美,但我应该运行一个bash进程,而我只是想运行一个javascript函数。整个node.js运行模型是单线程的,所以如果抛弃新进程,我只能运行两个线程? –

+0

每个子进程都有自己的线程,与父进程的线程分开。这给你并行执行。这是否回答你的问题......我完全不了解你的意见! – Matt

+0

所以你使用node.js创建进程,使用ipc来模拟node.js中的线程?用线程支持的服务器代替它会更好吗? –