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