node.js中的低优先级作业
基于节点使用单一线程来pipe理所有事情的事实,我很好奇我应该如何去处理一个低优先级的工作
这项工作是不断运行和分析数据(假设它是一个setTimeout
),但是它需要花费很多时间,我希望它在调度程序中具有非常低的优先级。
我不认为我可以在一个单独的过程中运行它,因为我需要经常修改它的工作指令(它使用我主进程的variables,所以它需要能够不断地访问它们)。
你可以把它想象成一大堆任务,它会一直工作,但是这些任务的工作集是由主进程控制的。
- 一个单独的过程需要两个人之间交换数据的不断请求,所以这似乎是一个坏主意
- 一个单独的线程,像networking工作者,可能会更快? 我不知道节点是否支持它们
- 最好的事情是将它作为一个运行在定时器上的简单事件函数,这个函数尊重节点的原则,但是我需要告诉调度器在这个函数上花费的时间比在程序的其余部分花费的时间less。 有什么办法吗?
首先让我开始说:
这是一个很大的问题。
一般来说,在单线程环境中运行“后台任务”是有问题的,原因很明显。
我们从最后开始,第三种方法。
使用带定时器的function:
用定时器运行第二个函数听起来不错,但是如何知道时间是否结束呢?
你可以做一些事情:
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,这似乎很适合您的用例创build后台线程。
注意:这不是一个可行的例子,threads_a_gogo在节点0.10.x中不起作用
他们有一个精心devise的例子(我在这里复制)在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)的并发队列中,然后通过NodeJSasynchronous执行,然后用“任务”代码读取它们(process ,是)执行这些任务。
这样,显然这个任务不是真正的服务器stream程的一部分。