2017-12-05 30 views
3

내가 종료 훅을위한 파이썬 "스레딩"동시성 및 "신호"를 사용하여 하나 개의 모듈 한 신호 이벤트를 먹는다 :파이썬 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') 

답변

3

아무도 관심이 없으므로 시도해보십시오.

그냥 동일한 페이지에있을 :

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에서 가져 왔고 hereGLib/GObject 루프를 가진 펄스 오디오 컨트롤러를 통합하는 또 다른 스레드입니다. 루프와의 통합 dbus에 대한 샘플이 있지만 어떤 방법으로 가고 싶은지 확실하지 않습니다 ...

+0

감사하지만, 그 상황을 돕는 것 같지 않습니다. 더 나은 실례로 질문을 업데이트했습니다. – pstanton

+0

네, 문제는'MainLoop'이 모든 리소스를 차지하고, 파이썬이 GIL 이후 싱글 쓰레드로 진행되기 때문입니다 ... DBus와 통합하는 유일한 방법은'MainLoop' 이벤트 시스템에 "stuff"를 넣는 것입니다. 그물에 예제가있다. 나는 그것을 다루기 위해 답을 업데이트하려고 노력할 것이다. –

+0

ok .. 다른 스레드가 정상적으로 작동하는 것처럼 보이기 때문에 혼란 스럽습니다. 신호/종료가 실행되지 않습니다. 그래서 MainLoop이 신호를 왜곡합니까? 어쩌면 메인 훅에 셧다운 훅을 추가 할 수 있을까요? – pstanton