gpt4 book ai didi

python - 为什么 asyncio.wait_for() 需要超时?

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:35 43 4
gpt4 key购买 nike

下面是一个运行两个后台任务的简单异步循环。

它们都执行简单的计数。第一个永远重要,包裹在尝试/除外。第二个数到 5,然后取消第一个,停止循环。

有两种方法可以确保取消完成 -

asyncio.wait([a sequence of futures])

asyncio.wait_for(a single future)

两者都需要一个可选的超时。

如果我使用第一种方法且没有超时,则取消完成并且循环停止。

如果我使用第二种没有超时的方法, future 会被取消,但是程序挂起。

如果我为第二个添加超时,它的行为与第一个相同。

这有什么原因吗?

我使用的是3.6.0版本。

import asyncio
from itertools import count

async def counter1():
cnt = count(1)
try:
while True:
print('From 1:', next(cnt))
await asyncio.sleep(1)
except asyncio.CancelledError:
print('counter1 cancelled')

async def counter2():
cnt = count(1)
for i in range(5):
print('From 2:', next(cnt))
await asyncio.sleep(1)
cnt1.cancel()
# await asyncio.wait([cnt1]) # works
# await asyncio.wait_for(cnt1) # hangs
await asyncio.wait_for(cnt1, 1) # works
loop.stop()

loop = asyncio.get_event_loop()
cnt1 = asyncio.ensure_future(counter1())
cnt2 = asyncio.ensure_future(counter2())
loop.run_forever()

最佳答案

我在 comp.lang.python 上收到以下答案 -

“当循环退出时,未处理的异常将显示为警告。在此之前它无法显示,因为可能存在其他一些任务,即使是尚未安排的任务,也可能会尝试获取counter2 任务的结果并处理异常。”

我正在 Windows 上进行测试。我从来没有让 Ctrl-C 在 Windows 上工作,所以我使用 Ctrl-Pause,这会使解释器崩溃,而不显示任何挂起的回溯。

在 Linux 上运行该程序并按 Ctrl-C 确实会显示回溯。如果我一开始就在 Linux 上进行测试,就没有必要发布原来的问题。

关于python - 为什么 asyncio.wait_for() 需要超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47467025/

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