如果创建了一个进程池,有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()
有人能解释一下进程池在这方面是如何工作的吗?谢谢!
发布于 2013-05-07 00:06:07
您可以使用以下命令实现进程池(例如,在C++中)
Process类(特别是知道每个fork-ed进程的pid )。它将有一些空实例(其pid将为0)。在进程池中使用代表要启动的命令的Process-esCommand类的某个全局数组(在可能的情况下)。std::deque<Command> of commands,在可能的情况下,Command将考虑SIGCHLD而触发一些SIGCHLD事件循环;当代码发生时,您将使用<代码>D21来waitpid,并获得结束的Process的pid,因此找到实际的Process实例并执行任何需要的操作;该事件循环可能会弹出Command-s运行(因此将启动非空闲的Process-es)、管理管道等……然后,空闲进程将只由一个具有零pid的Process插槽表示;不需要显式地fork它。所以它们不会是unix进程...只是进程池软件中的一些内部表示。
我的观点是,进程池机制不必(通过fork系统调用)启动空闲进程。它可以维护一个进程描述符池,并且对于空闲插槽,可以特别标记该描述符。该进程描述符实际上可以是一个pid_t和具有(pid_t)0的空槽,它永远不是任何实际Unix进程的pid。因此,没有必要提前创建流程(但只需在必要时进行惰性创建)。因此,不需要空闲进程。
我强烈建议花几个小时阅读Advanced Linux Programming。它会教你比我在几分钟内能学到的更好。
例如,查看Unix (或GNU) batch (和at)命令。它不使用任何空闲进程。而且它确实管理着一个进程队列池。它是,所以您可以研究(并改进)它的source code。
https://stackoverflow.com/questions/16401799
复制相似问题