python - 优雅的关闭和信号处理

标签 python python-3.x python-asyncio

我正在尝试编写一个asyncio脚本,该脚本可以通过发送SIGHUP信号来正常关闭。

import asyncio
from signal import SIGHUP

def handle_sighup():
    print("sighup received")
    raise Exception()

async def main():
    asyncio.get_running_loop().add_signal_handler(SIGHUP, handle_sighup)
    while True:
        print("running")
        await asyncio.sleep(1)

try:
    asyncio.run(main())
finally:
    asyncio.run(graceful_shutdown())

我天真地认为在处理程序中引发未处理的异常会传播到主协程并导致 finally block 执行。然而,在打印“sighup receive”之后,主协程继续运行。

我猜回调正在执行程序中运行?

如何重构此代码,以便处理信号以导致主协程停止并执行到 finally block ? 有更好的方法吗?

最佳答案

您可以使用sys.exithandle_sighup

import asyncio
import signal
import sys

def handle_sighup():
    print("sighup received")
    sys.exit(0)

async def graceful_shutdown():
    await asyncio.sleep(0.5)
    print("shutdown")

async def main():
    asyncio.get_running_loop().add_signal_handler(signal.SIGHUP, handle_sighup)
    while True:
        print("running")
        await asyncio.sleep(1)

try:
    asyncio.run(main())
except SystemExit:
    asyncio.run(graceful_shutdown())
# finally:  # you can put it in finally instead of except, up to you
#    asyncio.run(graceful_shutdown())

关于python - 优雅的关闭和信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57272992/

相关文章:

python - 如何将日期设置为该月的第一个日期?

python - 检查用户输入的 IP 地址是否有效

python - 将带有日期和时区的字符串解析为 UTC 日期时间

python - <script> 与包含在 Django 模板中的比较

python - 使用 python 从网站中仅提取 'strong' 标题后的要点

python - 为什么 asyncio 中的异常迟到或根本不出现?

python3 asyncio start_unix_server 权限

python-3.x - 具有 map&reduce 风格且不会淹没事件循环的异步

python - python装饰背后的机制

python - 如何清理 iPython 环境以便我可以重新开始使用 Jupyter 和 Python 3.x?