gpt4 book ai didi

python - 通过 SIGTERM 间接停止 python asyncio 事件循环无效

转载 作者:行者123 更新时间:2023-12-03 18:32:57 26 4
gpt4 key购买 nike

下面的最小程序重现了该问题。

import asyncio
import signal

class A:
def __init__(self):
self._event_loop = asyncio.new_event_loop()

def run(self):
print('starting event loop')
self._event_loop.run_forever()
print('event loop has stopped')

def stop(self):
print('stopping event loop')
self._event_loop.stop()


if __name__ == '__main__':
a = A()

def handle_term(*args):
a.stop()

signal.signal(signal.SIGTERM, handle_term)
a.run()

如果您运行该程序并向该进程发送一个 SIGTERM,则会调用第 16 行(停止事件循环)中的打印语句,但该程序不会终止,并且永远不会调用第 13 行(事件循环已停止)中的打印语句。所以似乎事件循环从未停止和 self._event_loop.run_forever()无限期地阻止。

为什么是这样?

注意:程序的修改版本,其中 a.stop()不是由信号处理程序调用,而是由具有延迟的单独线程调用,按预期工作。怎么能有所作为 a.stop()叫做?

最佳答案

而不是 signal.signal()使用 loop.add_signal_handler() :

import asyncio
import signal

import os


class A:
def __init__(self):
self.loop = asyncio.new_event_loop()
self.loop.add_signal_handler(signal.SIGTERM, self.stop)

def stop(self):
print('stopping')
self.loop.stop()

def run(self, close=True):
print('starting loop')
try:
self.loop.run_forever()
print('loop stopped')
finally:
if close:
self.loop.close()


if __name__ == '__main__':
print("to stop run:\nkill -TERM {}".format(os.getpid()))
a = A()
a.run()

关于python - 通过 SIGTERM 间接停止 python asyncio 事件循环无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628795/

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