2013-05-01 5 views
4

이 사소한 파이썬 G 객체 프로그램을 살펴 : 그것은 출력 스레드를 스폰Python 스레드가 pygobject와 함께 작동하지 않습니까?

import threading 
import gobject 
import time 

def f(): 
    while True: 
     print "HELLO" 
     time.sleep(1) 
threading.Thread(target=f).start() 

gobject.MainLoop().run() 

「HELLO」매초 후 G 객체 메인 루프에 들어간다. 문제는 실제로 아무 것도하지 않는다는 것입니다. 왜?

$ python a.py 
[...] 

그러나 Ctrl + C를 누르면 작동합니다. 또한 프로그램의 마지막 줄을 제거하면 (gobject.MainLoop().run()) 제대로 작동합니다. 왜?

$ python a.py 
^CTraceback (most recent call last): 
    File "a.py", line 11, in <module> 
    gobject.MainLoop().run() 
KeyboardInterruptHELLO 

HELLO 
HELLO 
HELLO 
[...] 

는 기능 g 초마다 실행하는 G 객체 이야기를 제외하고 정확히 첫 번째로 동일합니다,이 두 번째 프로그램에서 살펴 보자. 이 일종의 작품은 스폰 된 스레드가 절대로 실행되는 것이 아니라 한 번씩 실행됩니다. 왜?

import threading 
import gobject 
import time 

def f(): 
    while True: 
     print "HELLO" 
     time.sleep(1) 
threading.Thread(target=f).start() 

def g(): 
    print "yo" 
    return True 
gobject.timeout_add_seconds(1, g) 

gobject.MainLoop().run() 

을 실행 :

$ python b.py 
HELLOyo 

yo 
yo 
yo 
HELLO 
yo 
yo 
yo 
yo 
yo 
yo 
yo 
HELLO 
yo 
yo 
yo 
yo 
^CTraceback (most recent call last): 
    File "b.py", line 16, in <module> 
    gobject.MainLoop().run() 
KeyboardInterrupt 
HELLO 
HELLO 
HELLO 
HELLO 
HELLO 

그리고 다시는 타격 CTRL + C는 양산 스레드 작업을합니다. 왜?

이것은 pygobject-2.28.6 라이브러리를 사용하고 있습니다.

답변

1

gobject을 사용할 경우 initialize threading이 필요합니다. 이를 위해

gobject.threads_init() 
+0

흠,이 문제가 해결 된 것으로 보입니다. 그러나 동시 발생 이벤트의 순서를 변경하는 것에서 만 우연 일 수도 있습니다. 라이브러리를 사용하기 전에 라이브러리에서 함수를 호출하지 않으면 라이브러리가 전체 런타임을 중단한다는 것은 터무니없는 것입니다. 또한 "파이썬 스레드를 사용하여 그놈 플랫폼 **과 상호 작용하려는 응용 프로그램의 경우 스레드를 실행하거나 생성하고 주 루프를 시작하기 전에 GObject.threads_init()를 호출해야합니다." 나는 단지 주 스레드에서 gobject를 사용하기 때문에 나의 경우를 다루지 않는다. – Dog

+0

C에서의 glib에서도 ** 하나 이상의 스레드 **에서 GLib을 사용하는 경우 g_thread_init()를 호출하여 스레드 시스템을 초기화해야합니다. " (https://developer.gnome.org/glib/2.30/glib-Threads.html#g-thread-init) – Dog

+0

glib mainloop이 다른 모든 스레드를 차단하는 이유를 정확히 알지 못합니다. 올바르게 초기화하지 않으면 GIL을 실행하지 마십시오. 그러나 나는 그것을 지원할 어떤 참고 문헌도 찾을 수 없다. (여기 [https://bugzilla.gnome.org/show_bug.cgi?id=686914]를 제외하고)). – mata