python gobject.mainloop gobbles信号事件

问题描述 投票:3回答:1

我有一个模块使用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')
python dbus gobject
1个回答
4
投票

没有人感兴趣,所以让我试试吧。

只是在同一页面上:

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

Edit

这是从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与循环的示例,但我不确定您希望采用哪种方式...

© www.soinside.com 2019 - 2024. All rights reserved.