1.concurrent.futures模块介绍
2.ThreadPoolExecutor线程池使用
3.ProcessPoolExecutor进程池使用
4.其他方法使用
1.concurrent.futures模块介绍
1 # 介绍 2 concurrent.futures模块提供了高度封装的异步调用接口 3 ThreadPoolExecutor:线程池,提供异步调用 4 ProcessPoolExecutor: 进程池,提供异步调用 5 6 # 基本方法 7 # submit(fn, *args, **kwargs) 异步提交任务 8 9 # map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作10 11 # shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作12 wait=True,等待池内所有任务执行完毕回收完资源后才继续13 wait=False,立即返回,并不会等待池内的任务执行完毕14 但不管wait参数为何值,整个程序都会等到所有任务执行完毕15 submit和map必须在shutdown之前16 17 # result(timeout=None) 取得结果18 19 # add_done_callback(fn) 回调函数
2.ThreadPoolExecutor线程池使用
1 from concurrent.futures import ThreadPoolExecutor 2 import time 3 import random 4 5 def task(n): 6 print(n) 7 time.sleep(random.randint(1, 3)) 8 return n ** 2 9 10 if __name__ == '__main__':11 executor = ThreadPoolExecutor(max_workers=5) # 最多5个线程12 futures = []13 for i in range(11):14 future = executor.submit(task, i)15 futures.append(future)16 executor.shutdown(True)17 print('+++>')18 for future in futures:19 print(future.result())
3.ProcessPoolExecutor进程池使用
1 from concurrent.futures import ProcessPoolExecutor 2 import os 3 import time 4 import random 5 6 def task(n): 7 print('%s is runing' % os.getpid()) 8 time.sleep(random.randint(1, 3)) 9 return n ** 210 11 if __name__ == '__main__':12 executor = ProcessPoolExecutor(max_workers=3) # 最多3个进程13 futures = []14 for i in range(11):15 future = executor.submit(task, i)16 futures.append(future)17 executor.shutdown(True)18 print('+++>')19 for future in futures:20 print(future.result())
4.其他方法使用
1 # map方法使用 2 import time 3 from concurrent.futures import ThreadPoolExecutor 4 5 def func(n): 6 time.sleep(2) 7 print(n) 8 return n * n 9 10 def call_back(m):11 print('结果是 %s' % m.result())12 13 tpool = ThreadPoolExecutor(max_workers=5) 14 tpool.map(func, range(20)) # 注意map方法拿不到返回值
1 # 回调函数 2 import time 3 from concurrent.futures import ThreadPoolExecutor 4 5 def func(n): 6 time.sleep(2) 7 print(n) 8 return n * n 9 10 # 回调函数11 def call_back(m):12 print('结果是 %s' % m.result())13 14 tpool = ThreadPoolExecutor(max_workers=5)15 for i in range(20):16 tpool.submit(func, i).add_done_callback(call_back)