了解进程池:进程池如何使用wait()来收获子进程



如果创建了一个进程池并且有 10 个进程但我的程序只使用 4 个进程这意味着有 6 个空闲进程

要使用进程池,通常伪代码是这样的:

pool=create_process_pool(M)
for i in 1:N:
    pool.run(task i)
pool.wait()
pool.close()

池如何决定何时调用 pool.wait((?在某些情况下:

如果 M>N,例如 M=10、N=6,则为 1,则有 4 个空闲进程。对于 6 个使用的进程,当它们完成运行并退出时,它们可以通知 pool.wait((,但对于 4 个空闲进程,由于它们没有运行,它们如何通知 pool.wait(( 它们已完成?

2.如果 M <N,则是一个进程完成一个任务并退出,则它可能用于另一个任务。那么这个过程怎么知道它将不再有任务,从而通知pool.wait((>

谁能解释一下进程池在这方面是如何工作的?谢谢!

您可以使用以下方法实现一个进程池(例如在C++中(

  1. 一些Process类(特别是,知道每个fork -ed过程的pid(。它将有一些空实例(其 pid 为 0(。

  2. 一些全局数组的Process -ES

  3. 一个Command类,表示要在进程池中启动的命令(如果可能(。

  4. 命令std::deque<Command>,如果可能的话,Command会触发一些Process

  5. 一个考虑SIGCHLD的事件循环;当SIGCHLD发生时,你会waitpid WNOHANG并获取结束Process的pid,所以找到实际的Process实例并做任何需要的事情;该事件循环可能会弹出Command-s运行(因此会启动非空闲Process-es(, 管理管道等

然后空闲进程将只用一个pid为零的Process槽表示;不需要明确地fork它。所以它们不会是Unix进程。只是工艺池软件中的一些内部表示。

我的观点是,进程池机制(不一定(不必启动(通过fork系统调用(空闲进程。它可以维护一个进程描述符池,对于空闲插槽,可以专门标记描述符。该进程描述符实际上可能是一个pid_t和空的插槽,具有(pid_t)0这绝不是任何真正的Unix进程的pid。因此,无需提前创建流程(而只需在必要时懒惰地创建(。因此,不需要空闲进程。

我强烈建议花一些时间阅读高级Linux编程。它会比我在几分钟内教得更好。

例如,看看Unix(或GNU(批处理(和at(命令。它不使用任何空闲进程。它确实管理一个进程队列池。它是自由软件,因此您可以研究(和改进(其源代码。

最新更新