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