node.js中的低优先级作业

马拉哈克

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

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

我认为我不能在单独的过程中运行它,因为我确实需要经常修改它的工作指令(它使用我的主过程的变量来工作,因此它需要能够不断访问它们)。

您可以将其想象为一大堆任务,它将不断进行工作,但是这些任务的工作集由主过程控制。

  • 一个单独的过程将需要两者之间不断的请求来交换数据,所以这似乎是一个坏主意
  • 像Web worker这样的单独线程可能更快些?我不知道节点是否支持它们
  • 最好的办法是使它成为一个在计时器上运行的简单事件函数,该函数尊重节点的原理,但我需要以某种方式告诉调度程序在此函数上花费的时间少于在程序其余部分上花费的时间。有什么办法吗?
本杰明·格伦鲍姆(Benjamin Gruenbaum)

首先让我开始说:

一个大问题。

通常,出于明显的原因,在单线程环境中运行“后台任务”是有问题的。

让我们从第三种方法开始。

将函数与计时器配合使用:

使用计时器运行第二个功能听起来不错,但是如何知道时间是否结束?

您可以执行以下操作:

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

//这是子线程/后台线程中的.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执行写入操作,然后用“任务”代码读取它们(过程,是)来执行这些任务。

这样,很明显,此任务实际上不是正常服务器流程的一部分。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

序列化对象时,Android优先级作业队列错误

来自分类Dev

SGE低优先级单核作业阻止多核作业

来自分类Dev

Node.js Express路由命名和排序:如何确定优先级?

来自分类Dev

Node.js并行异步调用,但具有优先级

来自分类Dev

优先级,如何使用node express js处理xmlhttprequest发布请求

来自分类Dev

为作为Systemd服务运行的Node.js应用设置日志优先级

来自分类Dev

Mysql中的低优先级查询

来自分类Dev

Linux中的低优先级进程?

来自分类Dev

批处理作业中的作业优先级

来自分类Dev

如何在Angular JS中为:slug状态设置低优先级

来自分类Dev

为什么Scala中的!==优先级比===低?

来自分类Dev

创建低优先级的Android服务

来自分类Dev

低优先级运行或设置流程

来自分类Dev

低优先级运行或设置流程

来自分类Dev

journalctl - 清除低优先级消息

来自分类Dev

Sitecore计划作业的优先级

来自分类Dev

如何在延迟作业和活动作业中设置队列优先级?

来自分类Dev

Python中“ in”的优先级

来自分类Dev

mysql 中的优先级

来自分类Dev

增加优先级队列中的优先级

来自分类Dev

如何在Golang中以编程方式将流程(应用)优先级从“正常”更改为“低”

来自分类Dev

PHP-如何将Cookie的优先级值设置为高,低或中?

来自分类Dev

使用discord bot发送高优先级和低优先级消息

来自分类Dev

以非常低的优先级运行linux进程?

来自分类Dev

将任务调度到低优先级的UI线程

来自分类Dev

优先级非常低的Android http下载

来自分类Dev

js regexp-组优先级

来自分类Dev

基于相对优先级的作业调度算法

来自分类Dev

使用Optaplanner的基于优先级的项目作业计划

Related 相关文章

热门标签

归档