Я прочитал все сообщения, которые я мог найти о том, как изящно обрабатывать скрипт с асинхронным циклом событий, который завершается с помощью Ctrl-C, и я не смог заставить ни один из них работать без печати одной или нескольких трассировок, поскольку я Сделай так. Ответы почти повсюду, и я не смог реализовать ни один из них в этом маленьком скрипте:
import asyncio
import datetime
import functools
import signal
async def display_date(loop):
end_time = loop.time() + 5.0
while True:
print(datetime.datetime.now())
if (loop.time() + 1.0) >= end_time:
break
await asyncio.sleep(1)
def stopper(signame, loop):
print("Got %s, stopping..." % signame)
loop.stop()
loop = asyncio.get_event_loop()
for signame in ('SIGINT', 'SIGTERM'):
loop.add_signal_handler(getattr(signal, signame), functools.partial(stopper, signame, loop))
loop.run_until_complete(display_date(loop))
loop.close()
Я хочу, чтобы сценарий завершился без печати каких-либо трассировок после Ctrl-C (или SIGTERM/SIGINT, отправленных через kill
). Этот код печатает RuntimeError: Event loop stopped before Future completed.
В МНОГИХ других формах, которые я пробовал на основе предыдущих ответов, я получил множество других типов классов исключений и сообщений об ошибках, не зная, как их исправить. Приведенный выше код сейчас минимален, но некоторые из попыток, которые я предпринял ранее, были совсем другими, и ни одна из них не была правильной.
Если вы можете изменить сценарий так, чтобы он завершался корректно, мы будем весьма признательны за объяснение того, почему ваш способ сделать это правильным способом.