Linux 理解进程池:进程池如何使用wait()获取子进程?
如果创建了一个进程池,并且有10个进程 但我的程序只使用4个进程 这意味着有6个空闲进程 要使用进程池, 通常,伪代码如下所示:Linux 理解进程池:进程池如何使用wait()获取子进程?,linux,process,multiprocessing,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(),但是
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谢谢 您可以使用
进程
类(特别是,了解每个分叉
-ed进程的pid
)。它将有一些空实例(其pid为0)命令
类,表示进程池中要启动的命令(如果可能)std::deque
命令,如果可能,一个命令将触发一些进程
SIGCHLD
的事件循环;当出现SIGCHLD
时,您将waitpid
与WNOHANG
一起;该事件循环可能会弹出命令
-s以运行(因此将启动非空闲进程
-es)、管理管道等
进程
插槽表示,该插槽具有零pid
;无需显式地fork
it。所以它们不是unix进程。。。。只是流程池软件中的一些内部表示
我的观点是,进程池机制(不一定)必须启动(使用fork
系统调用)空闲进程。它可以维护一个进程描述符池,对于空闲插槽,专门标记描述符。该进程描述符实际上可能是一个pid\t
和具有(pid\t)0
的空插槽,这绝不是任何实际Unix进程的pid。因此,无需提前创建流程(但仅在必要时延迟创建)。因此,不需要空闲进程
我强烈建议花几个小时阅读。它会教你比我在几分钟内所能教的更好
例如,查看Unix(或GNU)(和
at
)命令。它不使用任何空闲进程。而且它确实管理一个流程队列池。是的,因此您可以研究(并改进)its。这可能取决于实现,但我认为空闲进程实际上并不存在(即,它们不是fork
-ed),只是进程池机器中的空插槽。。。(我看不出与的关系)当一个子进程完成它的任务时,它是一个僵尸进程,不是吗?不,不一定。如果父进程等待子进程,则该子进程不是僵尸进程。我在python中尝试了multiprocessing.pool,当N为10时,我使用了ps-ef
,看到有10个进程,所以有空闲进程。我知道有不同的实现,但它们应该有一个共同的机制是什么让你相信它们应该有一个共同的机制?如果我想在C++中实现进程池,我会约定一个带有0个PID的进程槽是空的槽,没有任何附加的进程。1关键字<代码>一些<代码> Measas>代码>某个<代码> >不是代码>几条< /代码>,对吗?什么是空实例?你是说没有任务的过程
还是根本没有过程?2全局流程阵列是预先分叉的,对吗?3这里的命令意味着任务?像exec(命令)?4这类似于(;;)do命令完成?我的理解是:程序应该提前进行一定数量的进程,例如10。如果有100个任务,我可以同时运行10个任务。如果程序检测到一个任务完成,该进程将变为空闲,并可用于启动另一个任务。是吗?不,您不需要提前创建空闲进程。空闲进程不存在,您只是将它们的插槽(在进程池管理器程序中)标记为空。但是您的2进程的一些全局数组似乎是预先创建的一些空闲进程?不是吗?我还是不明白,如果根本没有流程,当任务到来时,池必须立即创建一个新流程?好的,谢谢你的推荐。但就我上面的最后一个问题,你能解释一下吗?非常感谢你!