我如何使function在后台运行?

我有这个代码定期调用loadfunction,这非常负载工作需要10秒。 问题是当load函数被执行时,它阻塞了主stream。 如果在执行load发送一个简单的GET请求(如运行状况检查),GET调用将被阻塞,直到load调用完成。

 function setLoadInterval() { var self = this; this.interval = setInterval(function doHeavyWork() { // this takes 10 sec self.load(); self.emit('reloaded'); }, 20000); 

我尝试了async.parallel,但仍然阻止了GET调用。 我试过setTimeout但得到了相同的结果。 如何使load在后台运行,以防止主stream?

 this.interval = setInterval(function doHeavyWork() { async.parallel([function(cb) { self.load(); cb(null); }], function(err) { if (err) { // log error } self.emit('reloaded'); }) }, 20000); 

Node.js是一个事件驱动的非阻塞IO模型

作为IO的任何东西都作为底层引擎中的一个单独的线程被卸载,因此实现了并行性。 如果这个任务是CPU密集型的,那么默认情况下,你不可能实现并行性

但是,通过将CPU密集型任务卸载到不同的进程,还有一些方法可以实现这一点。

选项1:
执行或产生一个subprocess,并在该生成的节点应用程序中执行load()函数。 如果间隔发射的时间间隔是20000毫秒,那么在另一个发射的时间内是可以的,则10秒的过程将完成。
否则,这样做很危险,因为它可能会产生太多节点应用程序,从而耗尽系统资源

Option2:我不知道有多less数据self.load()接受和返回。 如果它是微不足道的,并且networking开销是可接受的,那么使该任务成为一个负载平衡的Web服务(可能是4个并行运行的Web服务器),它接受(而不是指向)1Mlogging并返回过滤的logging。

注意
看起来你正在使用节点asynchronous并行function。 但是从文档中记下这个描述。

注意:并行是关于并行启动I / O任务,而不是并行执行代码。 如果你的任务不使用任何定时器或者执行任何I / O,他们将会实际上被串行执行。 每个任务的任何同步设置部分都会一个接一个地发生。 JavaScript仍然是单线程的。