私は、シャットダウンフックの同時実行のために、「スレッド」、および「信号」のpythonを使用して一つのモジュールがあります:私はDBUSとのGObjectのpython gobject.mainloopゴブルズ信号イベント
を使用して、別のモジュールを持ってsignal.signal(signal.SIGINT, self.shutdownhook)
を
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
....
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloop.run()
これらを別々に実行すると、両方とも正常に動作し、ctrl+c
は「KeyboardInterrupt」で終了します。
しかし、それらを一緒に実行すると、メインループは終了しますが、シャットダウンフックは呼び出されません。プロセスはkill -9 pid
なしで終了しません。
誰かがこの問題が発生した理由を説明し、最善の方法ここでは、2つのモデルに
を統合することは私の問題を浮き彫りに実施例であるてくださいすることができます。私は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')
ありがとうございますが、それは状況を助けてくれないようです。私はより良い動作例で質問を更新しました。 – pstanton
はい、問題は、 'MainLoop'はすべてのリソースを取り、PythonはGILからシングルスレッドになっているからです... DBusと統合する唯一の方法は、あなたの" stuff "を' MainLoop'イベントシステムに置くことです。ネット上に例がありますが、私はそれに対処するために答えを更新しようとします。 –
ok ..私の他のスレッドは正常に動作しているようですが、信号/シャットダウンは決して起動しないので、混乱しています。だからMainLoopが信号をゴブリングする?たぶん、私はちょうどMainLoopにシャットダウンフックを追加できますか? – pstanton