工作池数据结构
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。
我想知道多处理模块中是否有本机实现允许我将 运行 进程存储在基于列表的结构中,并且每当进程完成执行时它会自动从列表中删除.
在代码中它看起来像这样:
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。