2014-12-15 9 views
13

ho davvero questo piccolo programma di test che non fa nulla a parte un l'esecuzione di un ciclo asyncio evento:Perché il ciclo degli eventi di asyncio sopprime KeyboardInterrupt su Windows?

import asyncio 
asyncio.get_event_loop().run_forever() 

Quando ho eseguito questo programma su Linux e premere Ctrl + C, il programma terminerà correttamente con un'eccezione KeyboardInterrupt. Su Windows premendo Ctrl + C non fa nulla (testato con Python 3.4.2). Un ciclo Inifinite semplice con time.sleep() solleva la KeyboardInterrupt correttamente anche su Windows:

import time 
while True: 
    time.sleep(3600) 

Perché ciclo di eventi del asyncio sopprimere il KeyboardInterrupt su Windows?

risposta

5

C'è una soluzione alternativa per Windows. Eseguire un altro corouting che svegliarsi ciclo ogni secondo e consentire ciclo di reagire sulla tastiera interrupt

Esempio con server di Echo da 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

Se si desidera solo per uscire dal programma e non hanno bisogno di recuperare il KeyboardInterrupt, il modulo signal fornisce una soluzione più semplice (e più efficiente):

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