【发布时间】:2019-04-27 09:28:30
【问题描述】:
有人可以帮我解释为什么当我在上下文管理器中使用超时时超时不能正常工作吗?
它在不使用上下文管理器的情况下正常工作,它会在 5 秒后引发 TimeoutException,但使用上下文管理器它不会在 5 秒后引发异常。
没有上下文管理器的实现
from concurrent import futures
MAX_WORKERS = 20
def download_one(c):
import time
time.sleep(100)
def download_many():
executor = futures.ThreadPoolExecutor(MAX_WORKERS)
res = executor.map(download_one, [1,2,3,4],timeout=5)
print(list(res))
return len(list(res))
download_many()
使用上下文管理器实现
from concurrent import futures
MAX_WORKERS = 20
def download_one(c):
import time
time.sleep(100)
def download_many():
with futures.ThreadPoolExecutor(MAX_WORKERS) as executor:
res = executor.map(download_one, [1,2,3,4],timeout=5)
print(list(res))
return len(list(res))
download_many()
【问题讨论】:
-
实际上,在这两种情况下都会引发
concurrent.futures._base.TimeoutError。但是,在第二个示例中,它是在所有线程完成后打印的。减少您的超时时间(或等待更长时间)以查看它。 -
我已经阅读了您链接到的线程,但这与我的情况并不重复。这两个例子都引发了 TimeoutError 但我不明白为什么在所有线程完成后引发 second 。除了在上下文管理器中退出上下文管理器时将调用 excecutor.shutdown(wait=True) 之外,一切都是相同的。
-
我认为这是相同的行为,但可能很难理解(多线程和异常有时可能很困难)。这当然是一个有趣的问题!我制定了一个解释/演示行为的答案。我希望它能回答你的问题。
标签: python-3.x python-multithreading threadpoolexecutor