2014-12-15 3 views
13

меня это действительно небольшая тестовая программа, которая не делает ничего, кроме от исполняющего петли asyncio события:Почему цикл событий asyncio подавляет KeyboardInterrupt в Windows?

import asyncio 
asyncio.get_event_loop().run_forever() 

Когда я запускаю эту программу на Linux и нажмите Ctrl + C, программа прекращает правильно с исключением KeyboardInterrupt. При нажатии Windows Ctrl + C ничего не делает (проверено на Python 3.4.2). Простой inifinite петля с time.sleep() поднимает KeyboardInterrupt правильно даже на Windows:

import time 
while True: 
    time.sleep(3600) 

Почему цикл событий в asyncio в подавить KeyboardInterrupt на Windows?

ответ

5

Существует обходное решение для Windows. Выполните еще один corouting, который просыпаясь цикл каждый второй и позволяют цикл реагировать на клавиатуре прерывания

Пример с сервером Echo из asyncio док

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

Если вы просто хотите, чтобы выйти из программы и не нужно, чтобы поймать KeyboardInterrupt, модуль signal обеспечивает более простое (и более эффективное) обходное решение:

# 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() 
Смежные вопросы