![](/img/trans.png)
[英]concurrent.futures does not throw exception when using try except
[英]Why does concurrent.futures executor map throw error when using with futures.as_completed after all the futures are complete?
我正在嘗試同時發送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
不會返回一個期貨列表,而是一個結果生成器,所以不是:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.