如果我的理解是正确的,处理后台任务是释放 CPU 绑定任务的主线程的好方法。
我不明白的是公牛或 kue 等系统使用什么来在主线程之外运行任务。
他们使用线程吗?它们是否需要整个节点进程分叉?它们会产生子进程吗?
如果我的理解是正确的,处理后台任务是释放 CPU 绑定任务的主线程的好方法。
我不明白的是公牛或 kue 等系统使用什么来在主线程之外运行任务。
他们使用线程吗?它们是否需要整个节点进程分叉?它们会产生子进程吗?
Bull 基于Redis,它在自己的进程中处理这些作业的数据处理和排队。它是一个轻量级、健壮和快速的作业处理队列。它使用redis进行持久化,因此如果服务器因任何原因宕机,队列不会丢失。
Job的内部实现可以看这里
Kue 模块也是如此,它是一个由 redis 进程支持的优先级作业队列,为 node.js 构建。后台任务由 Redis 提供支持。
这意味着这些模块依赖于 Redis 外部进程,可以创建不同的后台作业。
通过 Redis pubsub 在 Job 实例上触发特定于作业的事件:
enqueue
该作业现在已排队promotion
作业从延迟状态提升到排队状态progress
工作进度0-100failed attempt
作业失败,但仍有剩余尝试failed
作业失败并且没有剩余尝试complete
工作已经完成remove
该工作已被删除延迟的作业由 Redis 队列提供支持,它通知/触发模块中的回调。
这不是 node.js 的工作方式。Node.js 在内部使用事件循环来处理请求(因此,使其成为事件驱动的框架)
整个事件循环在单个线程中运行。当您执行一个长时间运行的命令(例如 I/O 或网络操作)时,请求被排入循环并且进程不会阻塞。当操作完成时,它会在您的代码中触发回调