Я пытаюсь добавить функцию тайм-аута при использовании 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 и отменить завернутую сопрограмму.Но поскольку задача не отменяется сразу, она будет отменена в следующем цикле.Но в этот момент цикл событий уже закрыт в моей программе.
Так что моя проблема в том, как правильно решить эту проблему.Должен ли я заботиться об этой ошибке?Потому что я всегда могу получить желаемый результат.