gpt4 book ai didi

python - 正常关机和信号处理

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:11 59 4
gpt4 key购买 nike

我正在尝试编写一个 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 received”之后,主协程继续运行。

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

我如何重构这段代码,以便可以处理信号以导致主协程停止并执行到 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/

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