node.js中的低优先级作业

Low priority job in node.js

本文关键字:优先级作业 js node      更新时间:2023-09-26

基于节点使用单个线程来管理所有内容的事实,我很好奇应该如何处理低优先级作业

这个作业一直在运行和分析数据(假设它是一个setTimeout),但它所做的工作需要很多时间,我希望它在调度器中的优先级非常低。

我不认为我可以在单独的流程中运行它,因为我需要经常修改它的工作指令(它使用我的主流程的变量工作,所以它需要能够不断地访问它们)。

你可以把它想象成一大堆任务,它会不断地工作,但这些任务的工作集由主进程控制。

  • 一个单独的进程需要在两者之间不断请求来交换数据,所以这似乎是个坏主意
  • 一个单独的线程,就像一个网络工作者,可能会更快?我不知道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_a_gogo一起使用,这似乎非常适合您创建背景线程的用例。

注意:这不是一个可行的例子,threads_a_gogo在节点0.10.x中不起作用

他们在GitHub上有一个详细的例子(我在这里复制),展示了如何使用带有事件发射器的线程:

quickIntro_evented_childThreadCode.js

//这是加载到子线程/后台线程中的代码:

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异步执行写入,然后我会用我的"任务"代码(进程,是的)来读取它们,以执行这些任务。

这样,很明显,这个任务并不是正常服务器流的一部分。