python多进程实例
from concurrent.futures import ProcessPoolExecutor
from datetime import datetime
import time
def work(x):
x += 1
time.sleep(10)
return x
def help(x):
x -= 1
time.sleep(10)
return x
def done(r):
print(r.result())
if __name__ == '__main__':
data = [1,2]
x = 1
with ProcessPoolExecutor() as pool:
#方式一:数据都用同一函数,则直接用map
# results = pool.map(work, data) #data是处理数据的集合
# print(list(results))
# 方式二:数据各用不同函数,则使用submit
1)
r = pool.submit(work, x) #x是待处理数据,相当于data的子元素
r.add_done_callback(done) #回调函数(必备),不然直接获取result,会阻塞后面提交的submit,就变变串行
2)
r = pool.submit(help, x)
r.add_done_callback(done)
3)对每个单独提交的进程的返回值进行合并
fs = []
for i in range(10):
fs.append(pool.submit(help, i))
ret = []
for r in concurrent.futures.as_completed(fs):
ret = ret + r.result() #直接使用result获取函数,会阻塞,但也是多进程,且时间差距不大。
附:1、向pool.map中传入多个参数的做法:
def func(x,y,z):
...
results = pool.map(func, *zip(*data)) #*zip(*)使用的非常巧妙
浙公网安备 33010602011771号