Ошибка игнорирования исключения при добавлении функции тайм-аута для asyncio.subprocess.communicate () в Python 3 - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь добавить функцию тайм-аута при использовании asyncio.subprocess.Я запускаю подпроцесс для выполнения некоторых команд, если это занимает слишком много времени, я хочу сделать его неудачным и завершить процесс.С точки зрения официального документа, я использую asyncio.wait_for для его реализации.Вот пример кода:

async def ping():
    cmd = 'ping localhost'
    proc = await asyncio.create_subprocess_shell(cmd, 
    stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE)
    try:
        stdout, _ = await asyncio.wait_for(proc.communicate(), 3)
    except asyncio.TimeoutError:
        print('Timeout')
        return 'Cancelled'
    finally:
        proc.terminate()

    return stdout.decode().strip()

def main():
    loop = asyncio.get_event_loop() #on windows, use another event loop to support subprocess
    task = asyncio.ensure_future(ping())
    result = loop.run_until_complete(task)
    print(f'the result is {result}')
    loop.close()

if __name__ == '__main__':
    main()

Я всегда могу получить результат, независимо от того, успешен он или нет.Но я получил ошибку в консоли при запуске.

В macOS ему нравится:

Exception ignored when trying to write to the signal wakeup fd:
BrokenPipeError: [Errno 32] Broken pipe

В Windows ему нравится: цикл обработки событий закрыт, задача уничтожена, но ожидает выполнения.Прошу прощения, я не могу вспомнить это ясно, сейчас я тестирую на Mac.

Я проверил некоторые ответы и обратился к документу, wait_for, чтобы вызвать TimeoutError и отменить завернутую сопрограмму.Но поскольку задача не отменяется сразу, она будет отменена в следующем цикле.Но в этот момент цикл событий уже закрыт в моей программе.

Так что моя проблема в том, как правильно решить эту проблему.Должен ли я заботиться об этой ошибке?Потому что я всегда могу получить желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...