Отменить процесс, когда истекло время ожидания с помощью asyncio python - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь отменить процесс, когда истекло время ожидания, но asyncio.wait_for не работает. Как отменить процесс, когда истекло время ожидания. Мой код ниже:

import asyncio
async def process():
    # do something take a long time like this
    for i in range(0,10000000000,1):
        for j in range(0,10000000000,1):
            continue
    print('done!')

async def main():
    # I want to cancel process when reached timeout
    try:
        await asyncio.wait_for(process(), timeout=1.0)
    except asyncio.TimeoutError:
        print('timeout!')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

1 Ответ

0 голосов
/ 06 марта 2020

Это не работает, потому что ваша process функция имеет асин c только в имени - она ​​не ждет ничего. Это означает, что он завершается полностью, не давая событию l oop возможности прервать его. Поскольку asyncio является кооперативной (как и другие системы, основанные на асинхронности / ожидании), такая функция не является правильно написанной asyn c функцией и не может быть прервана.

Если вы добавляете await asyncio.sleep(0.001) во внутреннюю l oop (или что-то еще, что ожидает чего-то, что действительно приостанавливается), ваш код будет работать нормально.

...