Я пытаюсь создать MainObject, который доступен как служба DBus. Этот MainObject всегда должен реагировать на другие объекты / процессы и на эту неблокировку даже при обработке своих элементов. по этой причине элементы обрабатываются в отдельном потоке один за другим (в стиле очереди). Вы можете добавлять элементы в MainObject через DBus или CommandLine. Я упростил пример (без dbus, без командной строки), чтобы показать мою проблему.
Моя проблема в том, что если я снова включаю tt.join (), приложение работает, как и ожидалось, но блокируется для других процессов. Неудивительно, что tt.join заставляет приложение ждать, пока отдельный поток завершит свою работу. С другой стороны, если tt.join () остается отключенным, приложение не блокирует внешние события dbus, но никогда не доходит до «ThreadTest done!» (посмотрите на реальный результат)
Что я хочу, так это мой ожидаемый результат, но приложения должны оставаться отзывчивыми.
#!/usr/bin/python2.5
import gobject
import threading
import re
import time
class ThreadTest(threading.Thread):
def __init__(self):
threading.Thread.__init__ (self)
print ' ThreadTest created!'
def run(self):
print ' ThreadTest running ...'
time.sleep(1)
print ' ThreadTest done!'
return True
class MainObject():
def __init__(self):
self.timer = gobject.timeout_add(1000, self.update)
self.loop = gobject.MainLoop()
print 'MainObject created!'
def update(self):
print 'MainObject updating ...'
if self.check_running() == False:
tt = ThreadTest()
tt.start()
#tt.join()
return True
def check_running(self):
running = False
expr = re.compile('ThreadTest')
for threadstr in threading.enumerate():
matches = expr.findall(str(threadstr))
if matches:
running = True
return running
mo = MainObject()
mo.loop.run()
ожидаемый результат:
MainObject created!
MainObject updating ...
ThreadTest created!
ThreadTest running ...
ThreadTest done!
MainObject updating ...
ThreadTest created!
ThreadTest running ...
ThreadTest done!
MainObject updating ...
ThreadTest created!
ThreadTest running ...
ThreadTest done!
MainObject updating ...
ThreadTest created!
ThreadTest running ...
ThreadTest done!
MainObject updating ...
ThreadTest created!
ThreadTest running ...
ThreadTest done!
реальная продукция:
MainObject created!
MainObject updating ...
ThreadTest created!
ThreadTest running ...
MainObject updating ...
MainObject updating ...
MainObject updating ...
MainObject updating ...
MainObject updating ...
MainObject updating ...
MainObject updating ...
MainObject updating ...
MainObject updating ...