簡體   English   中英

為什么在所有期貨完成后使用期貨時,concurrent.futures執行者映射會拋出錯誤.as_completed?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM