ThreadPoolExecutor as_completed 会不会阻塞主线程。我问了 chatgpt 和 kimi 。 chatgpt 一开始说不会阻塞,在我的追问下说会阻塞。 kimi 非常坚持,一直说不会阻塞,是我的理解有问题。

35 天前
 thinker3
2328 次点击
所在节点    Python
12 条回复
thinker3
35 天前
问的 chatgpt 3.5
Maerd
35 天前
不会阻塞
调用 future.result()时才会阻塞
msg7086
35 天前
Gemini 回复得很清晰啊,调用本身不会阻塞,然后获取结果的时候如果还没跑完才会阻塞,还有迭代器迭代完以后还没跑完的也会阻塞。

我用的 Prompt 是「 Python ThreadPoolExecutor as_completed 会不会阻塞主线程。如果不会阻塞,那什么时候会阻塞呢?」,你自己可以问问看。
thinker3
35 天前
@Maerd 调用 future.result()时已经有结果了,不会阻塞
thinker3
35 天前
@msg7086 gemini 坚持认为 as_completed 不会 阻塞主线程。它只会阻塞 生成器 本身。尽管在我的追问中,它犯了一个明显的错误。也许是我对阻塞的理解有误,换一个说法:as_completed 会阻止主线程继续执行循环外的代码,直到所有任务完成。
thinker3
35 天前
我一直追问 gemini, 它也改了:“因此,我们可以得出结论:as_completed 会阻塞 主线程 直到 所有 Future 对象完成。”
abersheeran
35 天前
你要是 for future in concurrent.futures.as_completed 那就会等到所有 future 完成,如果只是 concurrent.futures.as_completed 那就继续下一行了。

另外,future.result() 会阻塞当前线程直到 future 完成为止。
xuelang
35 天前
这样提问好些:
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 梳理了常见的一些异步任务等待。
msg7086
35 天前
我重新理了一下 AI 的说法,我觉得应该是这样的。
as_completed 产生迭代器这个操作是非阻塞的。找迭代器索要值的时候才会阻塞。

比如说伪代码:
1. a = as_completed(...)
2. b = a.get(0)

1 是不阻塞的,2 是阻塞的。
AsAsSaSa
35 天前
你们到底在尝试 AI 是否合理,还是 as_completed 是否阻塞……
如果是第二个问题,不如把文档复制过去提问(人工智能 RAG✘ 人工+智能✔)

简单地说是这样:
fs_ac = as_complete(fs)
fut1 = next(fs_ac) # 在这里阻塞
result = fut1.result()
AsAsSaSa
35 天前
看了一下,as_complete 文档的中文翻译错了……我去修一下
keakon
35 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1039745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX