concurrent
两个类
1. Future 类
-
cancel():尝试去取消调用。如果调用当前正在执行,不能被取消。这个方法将返回False,否则调用将会被取消,方法将返回True
-
cancelled():如果调用被成功取消返回True
-
running():如果当前正在被执行不能被取消返回True
-
done():如果调用被成功取消或者完成running返回True
-
result(Timeout = None):拿到调用返回的结果。如果没有执行完毕就会去等待 ; asyncio模块的result方法不支持设定时间
-
exception(timeout=None):返回由调用引发的异常。如果调用还没完成那么这个方法将等待 timeout 秒。如果在 timeout 秒内没有执行完成,concurrent.futures.TimeoutError 将会被触发。timeout 可以是整数或浮点数。如果 timeout 没有指定或为 None,那么等待时间就没有限制。如果 futrue 在完成前被取消则 CancelledError 将被触发。如果调用正常完成那么返回 None。
-
add_done_callback(fn):将fn绑定到future对象上。当future对象被取消或完成运行时,fn函数将会被调用
2. Executor 类(抽象类不直接使用,一般使用他的派生类 futures.ThreadPoolExecutor、 futures.ProcessPoolExecutor)
- Executor.submit(fn, *args, kwargs):函数fn(*args **kwargs)返回一个Future对象代表调用的执行。
- Executor.map(func, *iterables, timeout=None, chunksize=1) :类似于map,返回一个迭代器,迭代器的__next__方法调用各个future的result方法,得到各个future的结果。
- shutdown(wait=True):给executor发信号,使其释放资源,当futures完成执行时。已经shutdown再调用submit()或map()会抛出RuntimeError。使用with语句,就可以避免必须调用本函数。
两个模块函数
1. as_completed
- 用途: as_completed 在线程使用中,传入一个
futures
类列表,会返回一个futures
类的迭代器,通过迭代该迭代器可以获得已完成的futures
(流畅的python中说的是该函数返回一个迭代器,在future
运行结束后产出future
); - 注意: 用途类似map,但是生产中一般用 submit + as_completed 来代替map, 因为 map结果输出是依赖输入参数的,而 as_completed 则是一个 yield生成器返回,完成一个返回一个不会造成代码阻塞
2. wait
- 用途: 输出future 列表元素 完成和未完成情况
- 输出的结果包含:
Constant | Description |
---|---|
FIRST_COMPLETED | 当任何future 完成或取消或者线程函数执行完成时 |
FIRST_EXCEPTION | 当future通过引发异常而结束时,线程函数将返回。如果没有future引发异常,那么它相当于所有已完成的。 |
ALL_COMPLETED | 当所有future完成或取消时,函数将返回。 |
以上是 包包含的所有要点,接下来以一个实例说明应用
pass
参考: 官方文档