我有一个模块使用python“threading”进行并发,而“signal”用于shutdown hook:
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”导致终止。
但是,当我一起运行它们时,mainloop终止,但是从不调用shutdown钩子 - 如果没有kill -9 pid
,进程不会终止。
有人可以解释为什么会发生这种情况,以及如何最好地整合这两个模型
这是一个突出我问题的工作示例。我只能用CTRL + C来退出程序,在这种情况下也不会调用shutdown钩子。
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')
没有人感兴趣,所以让我试试吧。
只是在同一页面上:
import signal
from gi.repository import GObject
GObject.threads_init()
mainloop = GObject.MainLoop()
signal.signal(signal.SIGINT, lambda n, f: mainloop.quit())
mainloop.run()
此代码有效:
import signal
from gi.repository import GObject
signal.signal(signal.SIGINT, lambda n, f: print("kill"))
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloop.run()
我首先注册了信号处理程序,然后启动了循环。奇怪的是它没有被召唤。但结果是 - 正如所料......
作为旁注 - 根据他们的文件...... mainloop
已被弃用。这是第一件事。
这是从stdin
里面的MainLoop
读取的例子:
import signal
import sys
from gi.repository import GObject, GLib
GObject.threads_init()
def readInput():
print('readInput\n')
while True:
input = sys.stdin.readline()
print(input)
if input.strip() == 'exit':
print('closing main loop')
mainloop.quit()
print('terminating thread')
return
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal.SIG_DFL)
mainloop = GObject.MainLoop.new(None, False)
GObject.timeout_add(1000, readInput)
# inputThread = threading.Thread(name='input', target=readInput)
# inputThread.start()
# print('started input')
print('running mainloop\n')
try:
mainloop.run()
except KeyboardInterrupt:
mainloop.quit()
添加.new(None, False)
允许CTRL-C
正常工作。从here采取它,here也是关于将脉冲音频控制器与GLib
/ GObject
环路集成的另一个主题。有关于集成dbus与循环的示例,但我不确定您希望采用哪种方式...