[英]Low priority job in node.js
基于节点使用单个线程来管理所有内容的事实,我很好奇我应该如何处理低优先级的工作
这项工作一直在运行和分析数据(假设它是一个setTimeout
),但它的工作需要花费很多时间,而且我希望它在调度程序中具有非常低的优先级。
我不认为我可以在一个单独的进程中运行它,因为我需要经常修改它的工作指令(它使用我的主进程的变量,所以它需要能够不断访问它们)。
您可以将其视为一大堆任务,它将不断工作,但这些任务的工作集由主进程控制。
首先让我先说:
通常,出于显而易见的原因,在单线程环境中运行“后台任务”是有问题的。
让我们从最后开始,第三种方法。
使用计时器运行第二个功能听起来不错,但它如何知道时间是否结束?
你可以这样做:
function myFunc(){
var date = Date.now();
while(date - Date.now() < 5 || nothingElseToDo()) { // 5 miliseconds
// do something
}
setImmediate(myFunc); // continue processing after event loop did a cycle
}
然而,这不是真正有效或精确,5毫秒是很多 。
或者,您可以使用threads_a_gogo 线程 ,这似乎非常适合您的用例创建后台线程。
他们在GitHub上有一个精心设计的例子(我在这里复制),展示了如何将线程与事件发射器一起使用:
quickIntro_evented_childThreadCode.js
//这是.load()编入子/后台线程的代码:
function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
thread.on('giveMeTheFibo', function onGiveMeTheFibo (data) {
this.emit('theFiboIs', fibo(+data)); //Emits 'theFiboIs' in the parent/main thread.
});
主文件:
var thread= require('threads_a_gogo').create();
thread.load(__dirname + '/quickIntro_evented_childThreadCode.js');
//Emit 'giveMeTheFibo' in the child/background thread.
thread.emit('giveMeTheFibo', 35);
//Listener for the 'theFiboIs' events emitted by the child/background thread.
thread.on('theFiboIs', function cb (data) {
process.stdout.write(data);
this.emit('giveMeTheFibo', 35);
});
(function spinForever () {
process.stdout.write(".");
process.nextTick(spinForever);
})();
这种事件发射器,主要应用程序将事件发送到一个非常适合您的用例的线程。
我也没有把我需要在后台处理的所有数据写入某个数据存储上的并发队列(可能是redis),然后异步地从NodeJS执行写入,然后我用我的'任务'代码读取它们(进程) ,是)执行这些任务。
这样,很明显这个任务实际上并不是正常服务器流的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.