【发布时间】:2017-03-07 04:40:11
【问题描述】:
以下最小程序重现了该问题。
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() 的调用方式有何不同?
【问题讨论】:
标签: python python-asyncio