concurrent包
concurrent.futures
3.2版本引入的模块.
异步并行任务编程模块, 提供一个高级的一部可执行的便利接口.
提供两个池执行器
ThreadPoolExecutor
异步调用的线程池的Executor
ProcessPlloExecutor
异步调用进程池的Executor
这两个池是惰性的, 不会立即创建线/进程
ThreadPoolExecutor对象
首先需要定义一个池额执行器对象, Executor类子类对象
方法 | 含义 |
---|---|
ThreadPoolExecutor (max_workers=1) |
池中至多创建max_workers个线程的池来同时异步执行,返回Executor实例 |
submit (fn, *args, **kwargs) |
提交执行的函数及其参数, 返回Future类的实例 |
shutdown (wait=True) |
清理池 |
Future类
方法 | 含义 |
---|---|
done() |
如果调用被成功的取消或者执行完成, 返回True (即线/进程已经结束了) |
cancelled () |
如果调用被成功的取消, 返回True |
running() |
如果正在运行且不能被取消, 返回True |
cancel() |
尝试取消调用.如果已经执行且不能取消返回False, 否则返回True |
result (timeout=None) |
取返回的结果, timeout为None, 一直等待返回; timeout设置到期,抛出concurrent.futures.TimeoutError异常(会阻塞) |
exception(timeout=None) | 取返回的异常, timeout为None, 一直等待返回;timeout设置到期, 抛出concurrent.futures.TimeoutError异常 |
import threading
from concurrent import futures
import logging
import time
# 定义输出的格式
FORMAT = "%(asctime)-15s\t[%(processName)s:%(threadName)s , %(process)d:%(thread)8d] %(message)s"
logging.basicConfig(level=logging.INFO, format=FORMAT)
def worker(n):
logging.info("begin to work{}".format(n))
time.sleep(5)
logging.info("finished{}".format(n))
# 创建线程池, 容量为3
executer = futures.ThreadPoolExecutor(max_workers=3)
fs = []
for i in range(3