将新任务分配给 forked() 进程

Posted

技术标签:

【中文标题】将新任务分配给 forked() 进程【英文标题】:Assign new tasks to forked() processes 【发布时间】:2019-10-29 09:16:35 【问题描述】:

我需要创建一个多进程程序:

    使用fork()创建5个进程; 使用管道发送内容以执行子进程 当子进程完成它的工作时,它应该从父进程接收新的工作,直到所有工作都完成。

现在我的想法是 wait() 处理已完成的子任务(它会退出),然后创建一个新的子进程,这样我总是最多有 5 个进程。

有没有办法“重用”已经存在的流程?也许“发出信号”?在 Google 上找不到。

使用 C。

【问题讨论】:

进程之间已经有一个管道。 尝试想出他们可以交流的方式。 多线程和线程安全的作业队列可能会更容易,除非有特定的原因要改用进程。 @gtzw 我必须使用带有 fork() 的进程作为请求。 @EOF 管道是单向的,我可以创建另一个管道并让父级等待 read()?但是它如何识别第一个可用的进程呢? @Bedo 您可以使用[p]select()[e]poll() 进行I/O 多路复用。或者,所有孩子都可以共享同一个管道的写端,并在完成后将他们的 pid 写入其中。您的问题有太多可能的答案。尝试缩小范围。此外,您在 google 上找不到任何与 IPC 相关的东西的想法是可笑的。 【参考方案1】:

我这样解决了我的问题:

孩子们将他们的计算结果写在管道 A 上(这个管道没有阻塞)。然后他们在管道 B 上等待下一个输入(该管道阻塞)。

父级循环所有子级尝试从管道 A 读取内容(此管道没有阻塞,因此如果子级没有发送任何内容,父级会继续)。如果管道 A 包含结果,则父级将另一个任务发送到管道 B 上的该子级。

每个孩子都有一个管道 A 和一个管道 B。

【讨论】:

当你说从孩子到父母的“A”管道是非阻塞的,你的意思是父母正在轮询管道吗?就父级的 CPU 使用而言,这将是非常的浪费。您应该改用[p]select()[e]poll() 如果“轮询”意味着父级继续循环并检查管道,是的,这就是我正在做的。由于孩子的任务很长,我在循环内的父级上添加了一个 sleep(1),因此它不会继续池化。

以上是关于将新任务分配给 forked() 进程的主要内容,如果未能解决你的问题,请参考以下文章

进程的调度概述

多进程和多线程

多进程

zookeeper基础学习-简介

进程调度是的任务是啥

Cilk中给线程分配任务,给NUMA节点分配线程