来自 python 文档
concurrent.futures.as_completed(fs, timeout=None)¶
返回由 fs 给出的 Future 实例(可能由不同的 Executor 实例创建)的迭代器,该迭代器在它们完成(完成或被取消)时产生期货。在调用 as_completed() 之前完成的任何期货都将首先产生。如果调用next () 并且在从原始调用 as_completed() 的超时秒数后结果不可用,则返回的迭代器会引发 TimeoutError 。timeout 可以是 int 或 float。如果未指定 timeout 或 None,则等待时间没有限制。
您需要了解executor.map()
和之间的区别executor.submit()
。第一个将函数映射到参数向量。它与 非常相似map
,但异步启动任务。submit(func, arg)
在每次调用时启动一项任务。在此任务中,func
适用于arg
.
这是一个可以在 python 3.0 上运行as_completed()
的示例submit()
from concurrent import futures
import urllib.request
URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']
def load_url(url, timeout):
return urllib.request.urlopen(url, timeout=timeout).read()
def main():
with futures.ThreadPoolExecutor(max_workers=5) as executor:
future_to_url = dict(
(executor.submit(load_url, url, 60), url)
for url in URLS)
for future in futures.as_completed(future_to_url):
url = future_to_url[future]
try:
print('%r page is %d bytes' % (
url, len(future.result())))
except Exception as e:
print('%r generated an exception: %s' % (
url, e))
if __name__ == '__main__':
main()
此处使用no map()
,任务运行时使用submit
andas_completed()
返回 fs 给出的 Future 实例的迭代器,当它们完成(完成或被取消)时产生期货。