Python 3:当另一个完成时创建新进程

时间:2017-11-07 19:45:44

标签: python-3.x python-multiprocessing

我有一个数据处理和处理程序,执行时间很长(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)进程。而且它并不好。 而且,不需要在子过程之间交换任何类型的数据。那就跑吧。 因此,在同一时间运行几个进程并在现有结束后添加一个新进程会很棒。

如何实施(如果可能的话)?

1 个答案:

答案 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