Worker_threads vs CPU 密集型任务的队列

Worker_threads vs Queues for CPU intensive tasks

我正在考虑使用 node.js 和 ffmpeg 实现视频转换器,但由于这是一项 cpu 密集型任务,它可能会阻止 express 处理其他请求。我找到了几篇关于此的文章,其中一些使用工作线程,而另一些则使用 Agendajs 或 Bull 等队列。

哪个更适合我的用例?视频转换器不必响应实际视频,它所要做的只是转换它,然后将其上传到 S3 存储桶中供以后检索。

两个子问题,这里:

  1. 第一个问题是在转换过程中保持界面响应。如果转换可能需要很长时间,并且您没有将其拆分成小块的好方法(这样您就可以为中间的请求提供服务),那么您确实需要异步处理它。

    因此您可能希望至少创建一个工作线程与主线程并行工作。

  2. 第二个问题大概是使转换 运行 变快。由于 - 正如您所写 - 这是一项 CPU 密集型任务,它可能会从额外的工作线程中获益。这可能意味着:

    2a。多个线程同时处理单个(排队的)转换任务

    2b。多个线程同时处理不同的转换任务

    2c。两者的结合。

好消息是您真的不必自己担心其中的大部分问题,因为 a) ffmpeg 已经在可能的情况下使用多线程(这取决于所使用的编解码器!),为您提供 2a 的现成解决方案。并且 b), node-fluent-ffmpeg (或 node-ffmpeg) 已经设计为异步调用 ffmpeg,从而解决问题 1.

剩下的唯一问题是,您是要确保一次只 运行 一个 ffmpeg 作业(排队),还是在请求时立即开始转换 (2b / 2c) ?后者将更容易实施。 但是,如果 很多 个作业同时 运行,这可能会给您带来麻烦。至少,每个转换作业都会缓冲一些输入和一些输出数据,这可能会让你陷入内存问题,

这就是队列的用武之地。您需要将作业放在一个简单的队列中,然后启动它们,以便不超过 n 并发 运行ning。最优的 n 不一定是 1,但不太可能大于 4 左右(同样,因为每个单独的转换都在利用并行性)。您将不得不对此进行一些试验,始终牢记答案可能因编解码器而异。