【发布时间】:2018-07-11 18:52:42
【问题描述】:
我已经阅读了每一篇我能找到的关于如何优雅地处理一个异步事件循环被 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(或通过kill 发送的 SIGTERM/SIGINT)之后的任何回溯。此代码打印RuntimeError: Event loop stopped before Future completed. 在我根据以前的答案尝试过的许多其他形式中,我得到了大量其他类型的异常类和错误消息,不知道如何修复它们。上面的代码现在是最小的,但我之前所做的一些尝试是不正确的,而且没有一个是正确的。
如果您能够修改脚本以使其优雅地终止,我们将非常感谢您解释为什么您的操作方式是正确方式。
【问题讨论】:
标签: python signals python-asyncio sigint