【问题标题】:Graceful shutdown and signal handling优雅关机和信号处理
【发布时间】:2019-07-31 22:19:28
【问题描述】:

我正在尝试编写一个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 块执行。然而,在打印“sighup received”后,主协程继续运行。

我猜回调正在执行器中运行?

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

【问题讨论】:

  • 一定要使用 asyncio 吗? trio 处理您所期望的异常。

标签: python python-3.x python-asyncio


【解决方案1】:

你可以在handle_sighup中使用sys.exit

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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-02-02
    • 2015-09-29
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多