0

如果创建了一个进程池并且有 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()完成?

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

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

4

1 回答 1

0

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

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

  2. 一些全局数组Process-es

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

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

  5. 考虑到的事件循环SIGCHLD;当 aSIGCHLD发生时,您将waitpid使用WNOHANG并获取结束的 pid,Process以便找到实际Process实例并执行所需的任何操作;该事件循环可能会弹出Command-s来运行(因此会启动非空闲Process-es),管理管道等...

然后空闲进程将仅由Process带有零的插槽表示pid;无需fork明确。所以它们不会是unix进程......只是进程池软件中的一些内部表示。

我的观点是进程池机制不必(必须)启动(通过fork系统调用)空闲进程。它可以维护一个进程描述符池,并为空闲槽专门标记描述符。该进程描述符实际上可能是一个pid_t空槽,(pid_t)0它永远不是任何真正的 Unix 进程的 pid。所以没有必要提前创建进程(但只是懒惰地,必要时)。因此,不需要空闲进程。

我强烈建议花几个小时阅读Advanced Linux Programming。它会在几分钟内教给你比我能教的更好的东西。

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

于 2013-05-06T16:06:06.910 回答