node.js - 节点 child_process exec() 使系统崩溃
问题描述
我有一个很大的文件文件夹,我浏览并启动一个 bash shell 命令(它与音频分析有关)。这些命令中的每一个都需要很长时间,并且我的虚拟机的 CPU 很快达到 100% 负载并崩溃。有没有办法控制child_process
' 的产生,从而保护操作系统免于崩溃?也许就像在给定时间运行有限的进程池或其他东西......我希望有人对此有经验,因为我在谷歌搜索问题时一无所获:D
我希望这个问题不是太异国情调:) 干杯!
解决方案
有没有办法控制 child_process' 的产生,从而保护操作系统免于崩溃?
就在这里。您可以使用某种预先构建的排队系统或作业管理系统,您可以在其中预先配置要同时处理这些不同作业的进程数,或者您自己构建。
与 stackoverflow 上的所有问题一样,如果您包含您现在拥有的实际代码,您将得到一个更针对您的特定情况的答案。但是,一般概念是您创建一个工作队列。您可以决定一次要处理多少个进程。当您向队列中添加某些内容时,您会检查有多少进程已经在运行。如果最大值已经在运行,那么您只需将任务添加到队列中。
如果最大进程数尚未运行,则创建一个新进程,将队列中最旧的项目传递给它,并增加一个计数器,以跟踪您当前打开的子进程(或工作进程)的数量。您监控每个过程,以便知道它何时完成。每当完成时,您不仅要处理结果,还要修改正在运行的进程数量的计数器,然后如果您没有达到最大值,则获取队列中的下一个作业并为其启动一个子进程。
子进程可以为每个作业运行到完成并停止,为每个新的排队项启动一个新进程,或者您可以让它们返回完成通信,但不终止,您可以向它们发送一个新的工作项。
在 npm 中有许多类似这样的作业管理或工人管理包,或者您可以相当简单地构建自己的。我个人会选择一个已经编写好的库,但是每个现有库的任务适用性取决于您尚未共享的具体实现细节。
推荐阅读
- mfc - 我可以将“DECLARE_DYNCREATE”转换为“DECLARE_DYNAMIC”吗?
- css - SASS - 如果选中子元素,则在父元素的伪元素(之后)中应用样式
- macos - 没有名为 ipykernel_launcher 的模块
- vue.js - 计算属性在 Vue/Nuxt 中未更新的问题
- java - Spring Boot 对每个请求进行身份验证
- sas - 需要帮助而不对某些数据进行排序
- unix - 如何基于一列合并两个文件并打印匹配和不匹配?
- ruby-on-rails - 如何在不重置数据库的情况下在 Elastic Beanstalk 上部署新版本的 Ruby on Rails 应用程序?
- php - 在 Laravel 中插入/更新模型时,有没有办法自定义 JSON 序列化?
- java - 为什么被同步阻塞的线程不能被中断?