基于 Node 使用单线程管理一切的事实,我很好奇我应该如何处理低优先级的工作
此作业不断运行并分析数据(假设它是一个 setTimeout
),但它所做的事情需要花费大量时间,我希望它在调度程序中具有非常低的优先级.
我不认为我可以在单独的进程中运行它,因为我需要经常修改它的工作指令(它使用我的主进程的变量工作,所以它需要能够不断地访问它们)。
你可以把它想象成一大堆任务,它会不断地处理,但这些任务的工作集是由主进程控制的。
- 一个单独的进程需要两者之间不断请求以交换数据,所以这似乎是个坏主意
- 一个单独的线程,比如网络 worker ,可能会更快?我不知道 Node 是否支持它们
- 最好是它是一个在计时器上运行的简单事件函数,它尊重 Node 的原则,但我需要以某种方式告诉调度程序在这个函数上花费的时间比在程序的其余部分花费的时间少.有什么办法吗?
最佳答案
首先让我说:
这是个大问题。
一般来说,出于显而易见的原因,在单线程环境中运行“后台任务”是有问题的。
让我们从头开始,您的第三种方法。
使用带有定时器的函数:
用计时器运行第二个函数听起来不错,但它怎么知道时间是否结束?
你可以这样做:
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使用 threads_a_gogo 似乎非常适合您的用例来创建后台线程。
注意:这不是一个可行的例子,threads_a_gogo 在 Node 0.10.x 中不起作用
他们在 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 异步执行写入,然后我会用我的“任务”读取它们执行这些任务的代码(过程,是的)。
这样一来,很明显这个任务实际上并不是正常服务器流程的一部分。
关于javascript - node.js 中的低优先级作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587435/