我有一个数据处理和处理程序,执行时间很长(1-2分钟)并且需要大量内存用于计算。
raw = ['a', 'b', 'c']
def handler():
# do something long
由于处理程序需要大量内存,我想在单独的子进程中执行它并在执行后将其终止以释放内存。类似下面的片段:
from multiprocessing import Process
for r in raw:
process = Process(target=handler, args=(r))
process.start()
问题是这种方法会导致立即运行len(raw)
进程。而且它并不好。
而且,不需要在子过程之间交换任何类型的数据。那就跑吧。
因此,在同一时间运行几个进程并在现有结束后添加一个新进程会很棒。
如何实施(如果可能的话)?
答案 0 :(得分:4)
按顺序运行流程,只需join
循环中的每个流程:
from multiprocessing import Process
for r in raw:
process = Process(target=handler, args=(r))
process.start()
process.join()
通过这种方式,您可以确保只有一个进程同时运行(无并发)
这是最简单的方法。要运行多个流程但限制同时运行的流程数,您可以使用multiprocessing.Pool
对象和apply_async
我已经构建了一个简单的例子来计算参数的平方,并模拟一个繁重的处理:
from multiprocessing import Pool
import time
def target(r):
time.sleep(5)
return(r*r)
raw = [1,2,3,4,5]
if __name__ == '__main__':
with Pool(3) as p: # 3 processes at a time
reslist = [p.apply_async(target, (r,)) for r in raw]
for result in reslist:
print(result.get())
运行这个我得到:
<5 seconds wait, time to compute the results>
1
4
9
<5 seconds wait, 3 processes max can run at the same time>
16
25