Python 3:当另一个进程完成时创建新进程
Python 3: create new process when another one finishes
我有一组数据要处理,处理程序执行时间长(1-2 分钟)并且计算需要大量内存。
raw = ['a', 'b', 'c']
def handler():
# do something long
由于handler需要大量内存,所以我想在单独的子进程中执行它,执行完后kill它以释放内存。类似于以下代码段:
from multiprocessing import Process
for r in raw:
process = Process(target=handler, args=(r))
process.start()
问题是这种方法会导致立即 运行ning len(raw)
进程。这不好。
此外,不需要在子进程之间交换任何类型的数据。结果就是 运行 他们。
因此,最好同时 运行 几个进程,并在现有进程完成后添加一个新进程。
如何实施(如果可能的话)?
按顺序 运行 您的进程,只是 join
循环中的每个进程:
from multiprocessing import Process
for r in raw:
process = Process(target=handler, args=(r))
process.start()
process.join()
这样你就可以确定只有一个进程在同一时间 运行ning(无并发)
这是最简单的方法。要运行多个进程但同时限制进程数运行ning,可以使用一个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
我有一组数据要处理,处理程序执行时间长(1-2 分钟)并且计算需要大量内存。
raw = ['a', 'b', 'c']
def handler():
# do something long
由于handler需要大量内存,所以我想在单独的子进程中执行它,执行完后kill它以释放内存。类似于以下代码段:
from multiprocessing import Process
for r in raw:
process = Process(target=handler, args=(r))
process.start()
问题是这种方法会导致立即 运行ning len(raw)
进程。这不好。
此外,不需要在子进程之间交换任何类型的数据。结果就是 运行 他们。
因此,最好同时 运行 几个进程,并在现有进程完成后添加一个新进程。
如何实施(如果可能的话)?
按顺序 运行 您的进程,只是 join
循环中的每个进程:
from multiprocessing import Process
for r in raw:
process = Process(target=handler, args=(r))
process.start()
process.join()
这样你就可以确定只有一个进程在同一时间 运行ning(无并发)
这是最简单的方法。要运行多个进程但同时限制进程数运行ning,可以使用一个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