工作池数据结构

Worker pool data structure

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

在代码中它看起来像这样:

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

另一种管理方法是保留字典:

pool = {
    processId: processObject
}

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

current_process = psutil.Process()
children = current_process.children(recursive=False)

但是,一旦进程终止,字典中对象的大小是多少?

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

要安全地对其进行迭代,您需要一个快照,这会使这种结构的全部工作变得毫无意义。当你需要更新你的池列表时,你最好明确地这样做,例如:

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

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

[p for p in multiprocessing.active_children()]

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