【发布时间】:2018-05-18 17:38:48
【问题描述】:
我有一个模块使用python“线程”进行并发,使用“信号”进行关闭挂钩:
signal.signal(signal.SIGINT, self.shutdownhook)
我有另一个使用 dbus 和 gobject 的模块
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
....
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloop.run()
当我单独运行它们时,它们都按预期运行,ctrl+c 通过“KeyboardInterrupt”导致终止。
但是,当我一起运行它们时,主循环会终止,但永远不会调用关闭挂钩 - 没有kill -9 pid,进程不会终止。
谁能解释一下为什么会发生这种情况,以及如何最好地整合这两个模型
这是一个突出我的问题的工作示例。我无法仅使用 CTRL+C 退出程序,并且在这种情况下也不会调用关闭挂钩。
import threading
import signal
import sys
from gi.repository import GObject
def runMainloop():
print('running mainloop')
mainloop.run()
def shutdown():
print('shutdown')
def readInput():
print('readInput')
print(sys.stdin.readline())
if __name__ == '__main__':
signal.signal(signal.SIGINT, shutdown)
signal.signal(signal.SIGTERM, shutdown)
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloopThread = threading.Thread(name='mainloop', target=runMainloop)
mainloopThread.setDaemon(True)
mainloopThread.start()
print('started')
inputThread = threading.Thread(name='input', target=readInput)
inputThread.start()
print('started input')
【问题讨论】: