concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor :线程池,提供异步调用
ProcessPoolExecutor :进程池,提供异步调用
基本方法:
submit(fn,*args,**kwargs)
异步提交任务。map(func,*iterables,timeout = None,chunksize = 1)
取代for
循环submit
操作。shutdown(wait = True)
相当于进程池pool.close()
+pool.join()
操作。
wait = True
时,等待池内所有任务执行玩毕回收玩资源后才继续。
wait = False
时,立即返回,并不会等待池内的任务执行完毕。
但不管wait
参数为何值,整个程序都会等到所有的任务执行完毕。
submit
和map
必须在shutdown
之前。- result(timeout = None) 取得结果
- add_done_callback(fn) 回调函数
例子:
- shubmit
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
tpool = ThreadPoolExecutor(max_workers = 5) #个数一般起不超过cpu个数*5个
for i in range(20):
tpool.submit(func,i)
print('主线程')
- shutdown
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
tpool = ThreadPoolExecutor(max_workers = 5) #个数一般起不超过cpu个数*5个
for i in range(20):
tpool.submit(func,i)
tpool.shutdown() #相当于执行close()和join()
print('主线程')
- result
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
return n * n
tpool = ThreadPoolExecutor(max_workers=5) # 个数一般起不超过cpu个数*5个
t_list = []
for i in range(20):
t = tpool.submit(func, i)
t_list.append(t)
tpool.shutdown() # 相当于执行close()和join()
print('主线程')
for t in t_list:
print('****', t.result())
- map
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
return n * n
tpool = ThreadPoolExecutor(max_workers=5) # 个数一般起不超过cpu个数*5个
tpool.map(func,range(20)) #拿不到返回值
- callback
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
return n * n
def call_back(m):
print('结果是%s' % m.result())
tpool = ThreadPoolExecutor(max_workers=5) # 个数一般起不超过cpu个数*5个
for i in range(20):
tpool.submit(func,i).add_done_callback(call_back)