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 라이브러리를 사용하고 있습니다.
흠,이 문제가 해결 된 것으로 보입니다. 그러나 동시 발생 이벤트의 순서를 변경하는 것에서 만 우연 일 수도 있습니다. 라이브러리를 사용하기 전에 라이브러리에서 함수를 호출하지 않으면 라이브러리가 전체 런타임을 중단한다는 것은 터무니없는 것입니다. 또한 "파이썬 스레드를 사용하여 그놈 플랫폼 **과 상호 작용하려는 응용 프로그램의 경우 스레드를 실행하거나 생성하고 주 루프를 시작하기 전에 GObject.threads_init()를 호출해야합니다." 나는 단지 주 스레드에서 gobject를 사용하기 때문에 나의 경우를 다루지 않는다. – Dog
C에서의 glib에서도 ** 하나 이상의 스레드 **에서 GLib을 사용하는 경우 g_thread_init()를 호출하여 스레드 시스템을 초기화해야합니다. " (https://developer.gnome.org/glib/2.30/glib-Threads.html#g-thread-init) – Dog
glib mainloop이 다른 모든 스레드를 차단하는 이유를 정확히 알지 못합니다. 올바르게 초기화하지 않으면 GIL을 실행하지 마십시오. 그러나 나는 그것을 지원할 어떤 참고 문헌도 찾을 수 없다. (여기 [https://bugzilla.gnome.org/show_bug.cgi?id=686914]를 제외하고)). – mata