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

时间:2013-05-06 15:15:36

标签: linux process multiprocessing

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

使用进程池, 通常伪代码如下:

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

池如何决定何时调用pool.wait()? 有一些情况:

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

如果M <2,则

2。 N,是一个完成任务并退出的进程,它可能用于另一个任务。那么这个过程如何知道它将不再有任务,所以请告知pool.wait()

任何人都可以解释一下过程池在这方面的工作原理吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用

实现进程池(例如,在C ++中)
  1. 一些Process课程(特别是,知道每个pid过程的fork)。它会有一些空的实例(其pid为0)。

  2. Process - es

  3. 的一些全局数组
  4. 一个Command类,表示要在进程池中启动的命令(如果可能)。

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

  6. 考虑SIGCHLD的事件循环;当发生SIGCHLD时,您waitpidWNOHANG并获得已结束Process的pid,因此请找到实际的Process实例并执行所需操作;该事件循环可能会弹出Command - s来运行(因此会启动非空闲Process - es),​​管理管道等......

  7. 然后,空闲进程将由Process个时隙表示,其中pid为零;无需明确fork。所以它们不会是unix进程....只是进程池软件中的一些内部表示。

    我的观点是,进程池机制不必(必须)启动(使用fork系统调用)空闲进程。它可以维护一个进程描述符池,并且对于空闲槽特别标记描述符。该进程描述符实际上可以是pid_t和具有(pid_t)0的空槽,它永远不是任何真正的Unix进程的pid。因此,不需要提前创建流程(但必要时只是懒惰)。因此,不需要空闲进程。

    我强烈建议花几个小时阅读Advanced Linux Programming。它会比几分钟内更好地教你。

    例如,查看Unix(或GNU)batch(和at)命令。它不使用任何空闲进程。它确实管理了一个进程队列池。它是free software,因此您可以研究(并改进)其source code