如果创建了一个进程池并且有 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++中(
-
一些
Process
类(特别是,知道每个fork
-ed过程的pid
(。它将有一些空实例(其 pid 为 0(。 -
一些全局数组的
Process
-ES -
一个
Command
类,表示要在进程池中启动的命令(如果可能(。 -
命令
std::deque<Command>
,如果可能的话,Command
会触发一些Process
-
一个考虑
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
(命令。它不使用任何空闲进程。它确实管理一个进程队列池。它是自由软件,因此您可以研究(和改进(其源代码。