工作池数据结构

时间:2018-11-08 12:32:50

标签: python python-3.x multiprocessing python-multiprocessing multiprocess

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

在代码中看起来像这样:

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)

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

1 个答案:

答案 0 :(得分:2)

我认为,这种假想的自我更新结构不是一个好主意,因为对于相同的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。