gpt4 book ai didi

python gobject.mainloop 吞噬信号事件

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:37 26 4
gpt4 key购买 nike

我有一个模块使用 python“threading”实现并发,使用“signal”实现关闭 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”导致终止。

但是,当我同时运行它们时,主循环终止但永远不会调用关闭 Hook - 进程不会在没有 kill -9 pid 的情况下终止。

谁能解释一下为什么会这样,以及如何最好地整合这两个模型

这是一个突出我的问题的工作示例。我无法仅使用 CTRL+C 退出程序,并且在这种情况下也不会调用关闭 Hook 。

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 已弃用。这是第一件事。

编辑

这是从 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()

添加 .new(None, False) 允许 CTRL-C 正常工作。取自here , 还有 here是另一个关于将脉冲音频 Controller 与 GLib/GObject 循环集成的线程。有关于将 dbus 与循环集成的示例,但我不确定您希望采用哪种方式...

关于python gobject.mainloop 吞噬信号事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647200/

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