这样提问好些:
Python 中 ThreadPoolExecutor as_completed 会不会阻塞主线程?
一步步思考并回答,然后写一个程序验证下。
回答:
在 Python 中,使用 concurrent.futures.ThreadPoolExecutor 的 as_completed 函数确实会阻塞主线程,但这取决于你如何使用它。as_completed 是一个生成器,它在等待任何提交到线程池的未来( future )任务完成时阻塞。当你遍历 as_completed 生成的结果时,如果结果尚未准备好,主线程将阻塞直到至少一个任务完成。
现在,让我们编写一个简单的程序来验证这一点。程序将创建一个线程池,提交几个任务,然后使用 as_completed 来检查这些任务的完成情况,观察主线程的行为。
```python
import concurrent.futures
import time
# 一个简单的任务函数,让线程休眠一段随机时间
def sleep_for_seconds(seconds):
print(f"开始任务,休眠 {seconds} 秒...")
time.sleep(seconds)
return f"休眠了 {seconds} 秒后完成"
# 创建线程池
with concurrent.futures.ThreadPoolExecutor() as executor:
# 提交几个任务到线程池
futures = [executor.submit(sleep_for_seconds, seconds) for seconds in [2, 3, 5]]
# 等待任务完成并打印结果
for future in concurrent.futures.as_completed(futures):
print(future.result())
```
在这个例子中,as_completed 将阻塞主线程,直到最先完成的任务返回结果。接着它会继续阻塞,直到下一个任务完成,依此类推。每完成一个任务,它就打印出来,这样你可以看到主线程在等待时的行为。
这篇文章写的不错
https://mp.weixin.qq.com/s/3CXn0osZ9xx7U15MRcBXuA 梳理了常见的一些异步任务等待。