Я не спрашиваю, как отменить такую задачу.Это невозможно, и это объясняется здесь: https://stackoverflow.com/a/33578893/5378816
Меня беспокоит это изменение в wait_for :
Изменено в версии 3.7: Когдаотменен из-за тайм-аута, wait_for ожидает отмены w.Ранее он сразу вызывал asyncio.TimeoutError.
Не поймите меня неправильно, мне это нравится, это улучшение.
Однако эта программа теперь зависает wait_for
(Python 3.7):
import asyncio
async def uncancellable():
while True:
try:
await asyncio.sleep(99)
except asyncio.CancelledError:
print("sorry!")
TIMEOUT = 1.0
async def test():
task = asyncio.get_event_loop().create_task(uncancellable())
try:
await asyncio.wait_for(task, TIMEOUT)
except asyncio.TimeoutError:
print("timeout")
asyncio.get_event_loop().run_until_complete(test())
Невозможная задача - ошибка программирования.Но если мне нужно быть оборонительным , как я могу предотвратить бесконечное зависание wait_for
?
Я попробовал это.Первый тайм-аут: до отмены, второй тайм-аут: до отказаКогда он поднимается asyncio.TimeoutError
Я не могу сказать, произошло ли это в первый или во второй тайм-аут.В основном я думаю, что это работает, но действительно ли это правильно?