1、concurrent包
此包3.2版本之后引入,只提供了一个模块futures
异步并行任务编程模块,提供了一个高级的异步可执行的便利接口。
提供了两个池执行器
ThreadPoolExecutor 异步调用的线程池 的 Executor
ProcessPoolExeutor 异步调用的进程池的 Executor
2、ThreadPoolExecutor 对象 -- 线程
首先需要定义一个池的执行器对象,Executor类子类对象。
Future类
测试:IO 密集型测试,创建一个线城池,开启三个线程,因为此模块没有提供join方法,所以通过编程来实现主线程等待。
1 import threading 2 from concurrent import futures 3 4 import logging 5 import time 6 7 FORMAT = '%(asctime)-15s\t %(process)s %(threadName)s %(process)s %(message)s' 8 logging.basicConfig(level=logging.INFO, format=FORMAT) 9 10 # 这是一个IO 密集型的函数,建议使用多线程 11 def worker(n): 12 logging.info('begin to work{}'.format(n)) 13 time.sleep(5) 14 logging.info('finisdhed{}'.format(n)) 15 return n 16 17 # 创建线程池,容量为3个 18 executor = futures.ThreadPoolExecutor(max_workers=3) 19 20 fs = [] 21 for i in range(3): 22 # 提交任务 23 future = executor.submit(worker, i) 24 fs.append(future) 25 26 27 while True: 28 time.sleep(1) 29 logging.info(threading.enumerate()) 30 31 flag = True 32 for f in fs: 33 logging.info(f.done()) 34 flag = flag and f.done() 35 36 if flag: 37 for f in fs: 38 logging.info('the ans is {}'.format(f.result())) 39 executor.shutdown() 40 logging.info(threading.enumerate()) 41 break 42 43 logging.info('--------------------')