2014-12-15 4 views
13

Ich habe dieses wirklich kleines Testprogramm, das nichts tut, außer einer Ausführung einer asyncio Ereignisschleife:Warum unterdrückt die Ereignisschleife des asyncio das KeyboardInterrupt unter Windows?

import asyncio 
asyncio.get_event_loop().run_forever() 

Wenn ich dieses Programm auf Linux laufen und drücken Ctrl + C, wird das Programm beendet richtig mit einer KeyboardInterrupt Ausnahme. Unter Windows Strg + C tut nichts (getestet mit Python 3.4.2). Eine einfache inifinite Schleife mit time.sleep() wirft die KeyboardInterrupt richtig, auch unter Windows:

import time 
while True: 
    time.sleep(3600) 

Warum die Ereignisschleife des asyncio die KeyboardInterrupt unter Windows unterdrücken?

Antwort

5

Es gibt eine Problemumgehung für Windows. Führen Sie eine weitere corouting, die jede Sekunde und ermöglichen Schleife up Schleife wecken auf Tastatur-Interrupt

Beispiel mit Echo-Server von 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 
asyncio.async(wakeup()) 

try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 
3

zu reagieren Wenn Sie nur das Programm beenden wollen und brauchen nicht zu fangen Das Modul KeyboardInterrupt, das signal Modul, bietet eine einfachere (und effizientere) Problemumgehung:

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