我正在尝试编写一个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.exit在handle_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/