gpt4 book ai didi

python - 使异步事件循环响应 Windows(和 Unix)上的 KeyboardInterrupt

转载 作者:行者123 更新时间:2023-12-05 07:32:56 25 4
gpt4 key购买 nike

当我的程序接收到 KeyboardInterrupt 时,我想调用一段代码 (self.client.logout()) 来提示在我的循环中运行的任务正常退出。

这是我的基本循环:

loop = asyncio.get_event_loop()

loop.run_until_complete(self.client.start(token))

我最初尝试简单地处理一个 KeyboardInterrupt:

loop = asyncio.get_event_loop()

try:
loop.run_until_complete(self.client.start(token))
except KeyboardInterrupt:
loop.run_until_complete(self.client.logout())
finally:
loop.close()

但是在按下 Ctrl+C 和调用 self.client.logout() 之间有一个很大的延迟(可变,≈1 分钟)。

我通过为 SIGINT/SIGTERM 添加处理程序设法在 Unix 系统上获得我想要的效果:

import signal

loop = asyncio.get_event_loop()

# enable the bot to respond to SIGINT/SIGTERM (Unix only)
try:
loop.add_signal_handler(signal.SIGINT, lambda: asyncio.ensure_future(self.client.logout())
loop.add_signal_handler(signal.SIGTERM, lambda: asyncio.ensure_future(self.client.logout())
except NotImplementedError:
pass # program is running in Windows - nothing we can do

try:
loop.run_until_complete(self.client.start(token))
except KeyboardInterrupt:
loop.run_until_complete(self.client.logout())
finally:
loop.close()

当我按下 Ctrl+C 或停止运行该程序的 systemd 守护进程时,注销函数会立即被调用。

如何在 Windows 上实现相同的目的?

最佳答案

晚了,但是,您可能有很多阻塞或高 cpu 函数在没有 KeyboardInterrupt 空间的情况下运行。 Asyncio 确实存在 Windows 和 KeyboardInterrupts 问题,因此事件循环有时会挂起,但是使用 self.client.run_until_complete(self.client.start(token)) 应该可以减轻或删除这些问题问题,至少以我的经验。但是对 loop.run_forever() 的调用总是有很小的机会错过中断并使程序挂起。

关于python - 使异步事件循环响应 Windows(和 Unix)上的 KeyboardInterrupt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50902618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com