python windows python-3.4 python-asyncio keyboardinterrupt

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?



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()