gpt4 book ai didi

python - 为什么在所有 futures 完成后与 futures.as_completed 一起使用时,concurrent.futures 执行器映射会抛出错误?

转载 作者:行者123 更新时间:2023-11-30 22:18:05 53 4
gpt4 key购买 nike

我正在尝试同时发送 HTTP 请求。为此,我使用 concurrent.futures

这是简单的代码:

import requests
from concurrent import futures

data = range(10)


def send_request(item):
requests.get("https://httpbin.org/ip")
print("Request {} complete.".format(item))


executor = futures.ThreadPoolExecutor(max_workers=25)

futures_ = executor.map(send_request, data)

for f in futures.as_completed(futures_):
f.result()

如果我运行它,我可以看到请求是异步发送的,这正是我想要做的。但是,当所有请求完成后,我收到以下错误:

Request 0 complete.
Request 6 complete.
...
Request 7 complete.
Request 9 complete.
Request 3 complete.
Traceback (most recent call last):
File "send_thread.py", line 18, in <module>
for f in futures.as_completed(futures_):
File "/usr/local/Cellar/python3/3.6.4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/concurrent/futures/_base.py", line 219, in as_completed
with _AcquireFutures(fs):
File "/usr/local/Cellar/python3/3.6.4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/concurrent/futures/_base.py", line 146, in __enter__
future._condition.acquire()
AttributeError: 'NoneType' object has no attribute '_condition'

这是一个非常奇怪的错误。这里 executor.map 似乎有问题。如果我用以下行替换 map ,它会按预期工作。

futures_ = [executor.submit(send_request, x) for x in data]

我错过了什么?试图找到两者之间的差异,但似乎无法理解是什么导致了上述问题。任何意见都将受到高度赞赏。

最佳答案

Executor.map不会返回 future 列表,而是返回结果生成器,因此:

futures_ = executor.map(send_request, data)
for f in futures.as_completed(futures_):
f.result()

你应该运行:

results = executor.map(send_request, data)
for r in results:
print(r)

关于python - 为什么在所有 futures 完成后与 futures.as_completed 一起使用时,concurrent.futures 执行器映射会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49466794/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com