首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理NodeJS中CPU密集型任务的多个请求?

如何处理NodeJS中CPU密集型任务的多个请求?
EN

Stack Overflow用户
提问于 2020-05-19 05:31:48
回答 2查看 513关注 0票数 0

在我的NodeJS中,有一个庞大的处理任务,包括从IBM下载大约600 my的音频文件(大约70 my的8到10音频),然后使用FFMPEG https://www.npmjs.com/package/ffmpeg处理这些音频文件。音频处理大约需要5分钟的时间。此过程是异步的,因此我的前端将响应。

如何处理同一个音频处理的多个请求,但问题是多个请求将有不同的音频要下载和处理,因此在处理多个请求时可能会出现争用情况。通过阅读其他堆栈溢出答案,我了解了创建子进程或工作线程之类的方法。什么将是适当的方法,我的用例,我如何确保种族条件是不满足的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-19 06:43:51

从ffmpeg模块的文档中我们可以看到以下内容:

这个库提供了一组函数和实用程序来抽象命令行使用ffmpeg。

我查看了ffmpeg模块的源代码,发现实现的核心如下:

代码语言:javascript
运行
复制
utils.exec([ffmpeg.bin,'-formats','2>&1'], settings, ...

utils.exec基本上是这样的:

代码语言:javascript
运行
复制
child_process.exec(finalCommand, settings, ...

因此,基本上,ffmpeg模块已经在使用子进程来执行CPU密集型任务。这意味着node.js没有执行任何CPU密集型任务。

这意味着您不需要做任何额外的来处理多个请求。您所做的任何其他事情都将只是使用更多的RAM,而不会带来任何性能上的好处。

如何扩大规模:

缩放在任何语言中都是一样的,因为您的服务器本质上已经是多线程/多处理。只需使用一个拥有更多核心的CPU。

扩展到CPU之外:

像Netflix和YouTube这样的大型服务可以并行处理成千上万的媒体。显然,你不能购买一个拥有数万个核心的CPU。如何扩展是在多个CPU/服务器之间负载平衡您的服务,而不是直接使用ffmpeg:

代码语言:javascript
运行
复制
 ┌─────────────────┐           ┌─────────────────────┐
 │ node web server │ --------> │ node ffmpeg servers │┐
 └─────────────────┘           └┬────────────────────┘│┐
                                └┬────────────────────┘│
                                 └─────────────────────┘
票数 1
EN

Stack Overflow用户

发布于 2020-05-19 06:14:05

背景

我也有过类似的经历,但那是视频转换和处理。我不得不使用ffmpeg将视频转换成不同的容器和质量格式。

解决方案

这是最好的方法,因为我的场景是创建一个作业队列。我使用了celery,它能够很好地处理它。

您的用例的等效值是- https://github.com/mher/node-celery

您必须生成一些工作人员,以便从像RabbitMQ这样的消息队列数据库中分配任务。任务完成后,他们异步地发送一个响应。希望这适用于您的场景。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61883891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档