首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解进程池:进程池如何使用wait()获得子进程?

理解进程池:进程池如何使用wait()获得子进程?
EN

Stack Overflow用户
提问于 2013-05-06 23:15:36
回答 1查看 3.1K关注 0票数 0

如果创建了一个进程池,有10个进程,但我的程序只使用了4个进程,这意味着有6个空闲进程

要使用进程池,通常伪代码如下所示:

代码语言:javascript
复制
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()

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-07 00:06:07

您可以使用以下命令实现进程池(例如,在C++中)

  1. 一些Process类(特别是知道每个fork-ed进程的pid )。它将有一些空实例(其pid将为0)。在进程池中使用代表要启动的命令的Process-es
  2. a Command类的某个全局数组(在可能的情况下)。
  3. a std::deque<Command> of commands,在可能的情况下,Command将考虑SIGCHLD而触发一些SIGCHLD事件循环;当代码发生时,您将使用<代码>D21来waitpid,并获得结束的Process的pid,因此找到实际的Process实例并执行任何需要的操作;该事件循环可能会弹出Command-s运行(因此将启动非空闲的Process-es)、管理管道等……

然后,空闲进程将只由一个具有零pidProcess插槽表示;不需要显式地fork它。所以它们不会是unix进程...只是进程池软件中的一些内部表示。

我的观点是,进程池机制不必(通过fork系统调用)启动空闲进程。它可以维护一个进程描述符池,并且对于空闲插槽,可以特别标记该描述符。该进程描述符实际上可以是一个pid_t和具有(pid_t)0的空槽,它永远不是任何实际Unix进程的pid。因此,没有必要提前创建流程(但只需在必要时进行惰性创建)。因此,不需要空闲进程。

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

例如,查看Unix (或GNU) batch (和at)命令。它不使用任何空闲进程。而且它确实管理着一个进程队列池。它是,所以您可以研究(并改进)它的source code

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16401799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档