1

如果我的理解是正确的,处理后台任务是释放 CPU 绑定任务的主线程的好方法。

我不明白的是公牛或 kue 等系统使用什么来在主线程之外运行任务。

他们使用线程吗?它们是否需要整个节点进程分叉?它们会产生子进程吗?

4

2 回答 2

1

Bull 基于Redis,它在自己的进程中处理这些作业的数据处理和排​​队。它是一个轻量级、健壮和快速的作业处理队列。它使用redis进行持久化,因此如果服务器因任何原因宕机,队列不会丢失。

Job的内部实现可以看这里

Kue 模块也是如此,它是一个由 redis 进程支持的优先级作业队列,为 node.js 构建。后台任务由 Redis 提供支持。

这意味着这些模块依赖于 Redis 外部进程,可以创建不同的后台作业。

通过 Redis pubsub 在 Job 实例上触发特定于作业的事件:

  • enqueue该作业现在已排队
  • promotion作业从延迟状态提升到排队状态
  • progress工作进度0-100
  • failed attempt作业失败,但仍有剩余尝试
  • failed作业失败并且没有剩余尝试
  • complete工作已经完成
  • remove该工作已被删除

延迟的作业由 Redis 队列提供支持,它通知/触发模块中的回调。

于 2016-04-13T04:58:42.427 回答
0

这不是 node.js 的工作方式。Node.js 在内部使用事件循环来处理请求(因此,使其成为事件驱动的框架)

整个事件循环在单个线程中运行。当您执行一个长时间运行的命令(例如 I/O 或网络操作)时,请求被排入循环并且进程不会阻塞。当操作完成时,它会在您的代码中触发回调

事件循环

于 2016-04-13T05:06:16.497 回答