当前位置: 首页 > 知识库问答 >
问题:

NodeJS批处理多处理池(或多线程)中的子进程

董高朗
2023-03-14

我知道子进程是进程,而不是线程。我使用了错误的语义,因为大多数人在谈到“多线程”时都知道您的意图。所以我会把它保留在标题中。

想象一下这样一个场景:使用一个自定义函数或模块,您连续有多个类似和复杂的事情要做。使用所有可用的核心/线程(例如8/16)非常有意义,这就是child_process.fork()的目的。

理想情况下,您需要多个同时工作的人员,并向一个控制器发送/从一个控制器发送/回调消息。

node cpool、fork pool、child pool都是这样做的一些模块,但它们似乎很旧/未维护/不受欢迎。

有很多类似的ish模块,但它们似乎最相关。他们所有人的共同点是两个promise,几乎没有明星,几乎没有分叉,并放弃。

通常情况下,当我找不到任何看起来有意义的任务时,我会错过一个更好的方法。因此我的问题。

我如何有一个托管的,排队的, 多线程 池的并行fork()s为我的自定义模块,做一些CPU密集型工作?

像TAGG和WebWorker线程这样的多线程模块是不一样的,因为它们不支持完整的模块(带有二进制编译组件)。

附言

我现在使用的是fork pool,它似乎正是我想要的,有一些奇怪之处,但我不相信这样一个未知且不受欢迎的模块会是这里唯一可行的选择。

共有3个答案

汪兴为
2023-03-14

我想提供一个选项,它不能完全回答你的问题,但在类似于你的情况下,当选择技术有灵活性时,可能会很有用。

如果将工作卸载到服务器上。NET环境(C#、F#、IronPython、PowerShell等)是可以接受的,您可能对Edge感兴趣。js项目。

这样,您可以使用Node进行IO密集型工作,并将计算密集型工作委托给.NET运行时托管在同一进程内。Edge.js提供高效的互操作性。NET代码,允许利用.NET任务并行库和其他功能,无需产生额外进程的开销。

无论何时制作混合应用程序,都会涉及维护和技术成本。仔细评估你所获得的,并根据项目的优先顺序确保它值得付出成本。

节点。js不太适合执行阻塞、CPU受限的工作负载。节点独特的设计特点。js是它的单线程、基于事件循环的体系结构。

节点。js应用程序通常通过将处理委托给外部进程或服务来处理CPU限制的工作负载。这涉及到跨越流程边界并导致额外的延迟。(更多)

在没有充分理由的情况下引入复杂性是愚蠢的。If节点。js可以处理任务本身,添加对的依赖。NET可能是杀伤力过大。然而,有许多任务是有价值的。成为一名优秀的工程师需要一些思考。

公西永嘉
2023-03-14

WebWorkers标准为JavaScript定义了一种使用多个线程的方法,并且可以并行执行比单个线程所能管理的更多的工作。

对于NodeJS,有几种实现,包括webworker-thread NPM模块。

使用fork是一条多进程路径,通常很难协调。NodeJS集群系统试图减轻这里的许多摩擦,但远非理想。

益源
2023-03-14

我建议您使用Redis之类的工具作为队列。下面是使用Redis和Kue在节点中创建消息总线的教程。这将可以很好地扩展,并允许您拥有多个进程、线程,甚至机器来生产和消费队列中的项目。

 类似资料:
  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 我有一个Spring Boot 1.5应用程序与Spring Batch 3.0.7和Java8。我最近收到了一些连接超时,当一个计划作业试图从5个线程开始时,而另一个长时间运行的批处理作业正在运行。似乎有15个线程合并的连接争用。我没有找到任何留档、博客或问题,似乎解决了Spring Batch中线程和池的相关性。 我使用HikariCP有3个连接,每个数据源配置为默认值(10个连接): bat

  • null 我更新了我的步骤并添加了一个ThreadPoolTaskExecutor,如下所示 在此之后,我的处理器将被多个线程调用,但使用相同的源数据。我还有什么需要做的吗?

  • 我尝试在下面的步骤中使用多线程,但下面出现了一个异常: 我的步骤:代码: 公共类SynchronizedItemStreamReader实现ResourceAwareItemReaderItemStream{ 谢谢!!!

  • 问题内容: 是否有用于工作线程的类,类似于多处理模块的类? 我喜欢例如并行化地图功能的简单方法 但是,我希望这样做而不会产生新流程的开销。 我知道。但是,在我的用例中,该函数将是绑定的函数,python包装器将在实际函数调用之前为其释放。 我必须编写自己的线程池吗? 问题答案: 我刚刚发现模块中实际上 有一个基于线程的Pool接口,但是它有些隐藏并且没有正确记录。 可以通过导入 它是使用包装Pyt