我有一个模块使用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
通过“键盘中断”导致终止。但是,当我将它们一起运行时,主循环终止,但永远不会调用关闭挂钩-如果没有
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')
最佳答案
没人感兴趣,让我试试。
就在同一页上:
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
内部读取的示例: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()
添加
MainLoop
允许.new(None, False)
正常工作把它从here中提取出来,同时here是另一个关于将脉冲音频控制器与CTRL-C
/GLib
环路集成的线程有一些关于将dbus与循环集成的示例,但我不确定您希望走哪条路。。。