1.线程池异步调用使用方式
from concurrent.futures import ThreadPoolExecutor,wait
import time,os
#要添加的进程任务
def eat(some):
print("I'm eating{}".format(some))
time.sleep(1)
return some
#回调函数
def go_to_wc(some):
res = some.result() #获取进程任务返回值的必要写法
print("I'm shitting {}".format(res))
if __name__ == "__main__":
start = time.time()
with ThreadPoolExecutor(max_workers=3) as peoples_pools:#创建一个线程池
for i in range(5):
peoples_pools.submit(eat,str(i)).add_done_callback(go_to_wc) #提交任务并添加回调函数
#标识关闭进程池,不再添加进程,
peoples_pools.shutdown(wait=True)#如果为True会等待线程池或进程池执行完成后释放正在使用的资源。如果 wait 为 False,将立即返回,所有待执行的期程完成执行后会释放已分配的资源
end = time.time()
print(end - start)
运行结果:
I'm eating0
I'm eating1
I'm eating2
I'm shitting 0
I'm eating3
I'm shitting 1
I'm shitting 2
I'm eating4
I'm shitting 3
I'm shitting 4
2.008730888366699
2.进程池异步调用使用方式
from concurrent.futures import ProcessPoolExecutor
import time
def eat(some):
print("I'm eating{}".format(some))
time.sleep(1)
return some
def go_to_wc(some):
res = some.result()
print("I'm shitting {}".format(res))
#多进程下的异步调用必须在if __name__ == "__main__"下执行,因为当一个子进程诞生后,会重读代码,读到“with ProcessPoolExecutor() as Exe:”时,在此创建了子进程,而多进程模块不允许子进程中再次创建子进程,所以直接运行会报错
if __name__ == "__main__":
start = time.time()
with ProcessPoolExecutor(2) as peoples_pools:
for i in range(5):
peoples_pools.submit(eat, str(i)).add_done_callback(go_to_wc)
peoples_pools.shutdown(wait=True)
end = time.time()
print(end - start)
运行结果:
I'm eating0
I'm eating1
I'm eating2
I'm shitting 0
I'm eating3
I'm shitting 1
I'm eating4
I'm shitting 2
I'm shitting 3
I'm shitting 4
3.187479257583618