내가 종료 훅을위한 파이썬 "스레딩"동시성 및 "신호"를 사용하여 하나 개의 모듈 한 신호 이벤트를 먹는다 :파이썬 gobject.mainloop는
signal.signal(signal.SIGINT, self.shutdownhook)
내가 가진 DBUS를 사용하고 다른 모듈은 G 객체
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
....
GObject.threads_init()
mainloop = GObject.MainLoop()
mainloop.run()
별도로 실행하면 모두 예상대로 작동하고 ctrl+c
은 "KeyboardInterrupt"를 통해 종료됩니다.
그러나 함께 실행할 때 메인 루프는 종료되지만 종료 훅은 호출되지 않습니다. 프로세스가 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')
감사하지만, 그 상황을 돕는 것 같지 않습니다. 더 나은 실례로 질문을 업데이트했습니다. – pstanton
네, 문제는'MainLoop'이 모든 리소스를 차지하고, 파이썬이 GIL 이후 싱글 쓰레드로 진행되기 때문입니다 ... DBus와 통합하는 유일한 방법은'MainLoop' 이벤트 시스템에 "stuff"를 넣는 것입니다. 그물에 예제가있다. 나는 그것을 다루기 위해 답을 업데이트하려고 노력할 것이다. –
ok .. 다른 스레드가 정상적으로 작동하는 것처럼 보이기 때문에 혼란 스럽습니다. 신호/종료가 실행되지 않습니다. 그래서 MainLoop이 신호를 왜곡합니까? 어쩌면 메인 훅에 셧다운 훅을 추가 할 수 있을까요? – pstanton