我正在尝试创建一个作为DBus服务可用的MainObject。这个MainObject应该始终对其他对象/进程保持响应,并且在处理其项时非阻塞,因此将项按顺序(队列方式)在单独的线程中处理。您可以通过DBus或CommandLine向MainObject添加项目。我简化了样本(没有dbus,没有commandline),以展示我的问题。
我的问题是,如果重新启用'tt.join()',应用程序将按预期工作,但会阻止其他进程。难怪,tt.join使应用程序等待,直到单独的线程完成其工作。另一方面,如果'tt.join()'保持禁用,则应用程序不会阻止外部dbus事件,但永远不会到达'ThreadTest done!'(请查看实际输出)
我想要的是,我的预期输出,但应用程序应该保持响应。
我的问题是,如果重新启用'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 ...