Взгляните на эту тривиальную программу gobject на Python:
import threading
import gobject
import time
def f():
while True:
print "HELLO"
time.sleep(1)
threading.Thread(target=f).start()
gobject.MainLoop().run()
Он порождает поток, который выводит «HELLO» каждую секунду, а затем входит в основной цикл объекта. Проблема в том, что он на самом деле ничего не делает. Почему?
$ 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
[...]
Взгляните на эту вторую программу, она точно такая же, как и первая, за исключением того, что она говорит gobject запускать функцию 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.