Worker_threads vs Queues用于CPU密集型任务

时间:2020-04-19 07:22:22

标签: node.js multithreading queue worker-thread

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

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

1 个答案:

答案 0 :(得分:0)

两个子问题,在这里:

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

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

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

    2a。多个线程同时执行一个(排队的)转换任务

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

    2c。两者的混合。

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

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

这是队列进入图片的地方。您需要将作业放在一个简单的队列中,然后启动它们,以使同时运行的内容不超过 n 个。最佳 n 不一定为1,但不可能大于4左右(再次,因为每个单个转换都在使用并行性)。您必须尝试一下,始终牢记答案可能因编解码器而异。

相关问题