python - ¿Por qué el bucle de eventos de asyncio suprime el KeyboardInterrupt en Windows?
python-3.4 python-asyncio (3)
Tengo este programa de prueba realmente pequeño que no hace nada aparte de ejecutar un bucle de eventos asyncio
:
import asyncio
asyncio.get_event_loop().run_forever()
Cuando ejecuto este programa en Linux y presiono Ctrl + C , el programa terminará correctamente con una excepción de KeyboardInterrupt
. En Windows, presionar Ctrl + C no hace nada (probado con Python 3.4.2). Un simple bucle de time.sleep()
con time.sleep()
eleva correctamente el KeyboardInterrupt
incluso en Windows:
import time
while True:
time.sleep(3600)
¿Por qué el bucle de eventos de asyncio suprime el KeyboardInterrupt en Windows?
Este es un error, claro.
Vea el problema en el rastreador de errores de Python para conocer el progreso de la resolución de problemas.
Hay una solución para Windows. Ejecute otro análisis de rutina que se activa cada segundo y permita que el bucle reaccione en la interrupción del teclado.
Ejemplo con el servidor Echo desde asyncio doc.
async def wakeup():
while True:
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
coro = loop.create_server(EchoServerClientProtocol, ''127.0.0.1'', 8888)
server = loop.run_until_complete(coro)
# add wakeup HACK
loop.create_task(wakeup())
try:
loop.run_forever()
except KeyboardInterrupt:
pass
Si solo desea salir del programa y no necesita capturar el KeyboardInterrupt
, el módulo de signal ofrece una solución más simple (y más eficiente):
# This restores the default Ctrl+C signal handler, which just kills the process
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
# Now the event loop is interruptable
import asyncio
asyncio.get_event_loop().run_forever()