我想知道多处理模块中是否有本机实现,可以让我将运行中的进程存储在基于列表的结构中,并且每当一个进程执行完毕时,它就会自动从列表中删除。
在代码中看起来像这样:
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)
但是,一旦进程死亡,字典中对象的大小是多少?
答案 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。