concurrent.futures
模块提供了一种高层次的界面,用于异步执行可调用对象(通常是函数)。这个模块在 Python 3.2 及更高版本中可用。主要的类和函数为:
1. Executor
类:
Executor
是一个抽象类,定义了异步执行可调用对象的通用接口。具体的实现类包括 ThreadPoolExecutor
和 ProcessPoolExecutor
。
2. ThreadPoolExecutor
类:
ThreadPoolExecutor
是一个使用线程池执行任务的实现。它允许将可调用对象提交到线程池中,并在后台异步执行。
3.ProcessPoolExecutor
类:
ProcessPoolExecutor
是一个使用进程池执行任务的实现。与 ThreadPoolExecutor
不同,ProcessPoolExecutor
在不同的进程中执行任务,适用于CPU密集型任务。
4. Future
类:
Future
表示异步计算的结果。通过 Executor.submit()
方法获得 Future
对象,然后可以在将来的某个时候获取实际的结果。
5. as_completed
函数:
as_completed
函数是一个生成器,它迭代一组 Future
对象,返回已完成的 Future
。可以用于按照完成顺序获取结果。
6. wait
函数:
wait
函数用于等待一组 Future
对象完成。可以指定超时时间,以便在超时后取消未完成的任务。
import concurrent.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/']
# Retrieve a single page and report the URL and contents
def load_url(url, timeout):
with urllib.request.urlopen(url, timeout=timeout) as conn:
return conn.read()
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# Start the load operations and mark each future with its URL
## 返回concurrent.futures.Future对象
#future = executor.submit(load_url, URLS[0], 60)
#print(future)
## 返回字典,键为future对象,值为网址
future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
#print(future_to_url)
## as_completed: used to iterate over the Future objects as they are completed.
#for future in concurrent.futures.as_completed(future_to_url.keys()):
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
# %r格式说明符用于字符串格式中,用于使用对象的__repr_方法表示对象的可打印版本。
print('%r page is %d bytes' % (url, len(data)))
## 超链接形式
#print('%s page is %d bytes' % (url, len(data)))
参考:
https://www.bookstack.cn/read/python-3.10.0-zh/89c904110447ef59.md