首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >职工池数据结构

职工池数据结构
EN

Stack Overflow用户
提问于 2018-11-08 12:32:49
回答 1查看 186关注 0票数 3

我想知道在多处理模块中是否有一个本机实现,它允许我将正在运行的进程存储在基于列表的结构中,并且每当进程完成执行时,它就会自动从列表中删除。

在代码中,它看起来如下所示:

代码语言:javascript
复制
from multiprocessing import process

pool = [] # This data structure needs to prune non-running processes

class A(Process):
     def run():
         pass

for i in range(0, 10):
    worker = A().start()
    pool.append(worker)


# So if I want to iterate the pool now, It should only contain the alive processes

处理这一问题的另一种方法是保存一本字典:

代码语言:javascript
复制
pool = {
    processId: processObject
}

然后使用psutil获取活动进程ids:

代码语言:javascript
复制
current_process = psutil.Process()
children = current_process.children(recursive=False)

然而,当进程死后,字典中的对象的大小是多少?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-09 00:12:32

我不认为这样一个假设的自更新结构会是一个好主意,对于同一个reason,您不应该在迭代列表时修改它。在遍历池时,进程可能会被删除。

为了安全地遍历它,您需要一个快照,这将使这样一个结构的全部工作变得毫无意义。当您需要更新池列表时,最好通过以下方法显式地这样做:

pool[:] = [p for p in pool if p.is_alive()] # p are your processes

或者,如果您想要所有进程范围内的、活动的子进程,而不仅仅是自定义池中的子进程:

[p for p in multiprocessing.active_children()]

当然,您可以将它放在函数或方法中的某个位置,并在需要实际池列表时调用它。进程有一个pid属性,所以您不需要只为获取进程ids而使用psutil

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

https://stackoverflow.com/questions/53207826

复制
相关文章

相似问题

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