如果创建了一个进程池并且有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()
任何人都可以解释一下过程池在这方面的工作原理吗? 谢谢!
答案 0 :(得分:0)
您可以使用
实现进程池(例如,在C ++中)一些Process
课程(特别是,知道每个pid
过程的fork
)。它会有一些空的实例(其pid为0)。
Process
- es
一个Command
类,表示要在进程池中启动的命令(如果可能)。
一个std::deque<Command>
个命令,如果可能,Command
会触发一些Process
考虑SIGCHLD
的事件循环;当发生SIGCHLD
时,您waitpid
会WNOHANG
并获得已结束Process
的pid,因此请找到实际的Process
实例并执行所需操作;该事件循环可能会弹出Command
- s来运行(因此会启动非空闲Process
- es),管理管道等......
然后,空闲进程将由Process
个时隙表示,其中pid
为零;无需明确fork
。所以它们不会是unix进程....只是进程池软件中的一些内部表示。
我的观点是,进程池机制不必(必须)启动(使用fork
系统调用)空闲进程。它可以维护一个进程描述符池,并且对于空闲槽特别标记描述符。该进程描述符实际上可以是pid_t
和具有(pid_t)0
的空槽,它永远不是任何真正的Unix进程的pid。因此,不需要提前创建流程(但必要时只是懒惰)。因此,不需要空闲进程。
我强烈建议花几个小时阅读Advanced Linux Programming。它会比几分钟内更好地教你。
例如,查看Unix(或GNU)batch(和at
)命令。它不使用任何空闲进程。它确实管理了一个进程队列池。它是free software,因此您可以研究(并改进)其source code。