长期潜伏在这里。
我有一个线程控制器对象。此对象接受称为“检查”的其他对象。这些检查会提取符合其条件的数据库行。线程管理器轮询每个检查(询问它的DB行也称为工作单位),然后将每一行排队以及对该检查对象的引用。我们的想法是N个线程会进入并从队列中取出一个项目并执行相应的Check的do_work方法。 do_work方法将返回Pass \ Fail,所有传递将被排队以进行进一步处理。
主脚本(未显示)实例化检查并使用add_check将它们添加到线程管理器,然后调用kick_off_work。
到目前为止,我正在测试,它只是锁定:
import Queue
from threading import Thread
class ThreadMan:
def __init__(self, reporter):
print "Initializing thread manager..."
self.workQueue = Queue.Queue()
self.resultQueue = Queue.Queue()
self.checks = []
def add_check(self, check):
self.checks.append(check)
def kick_off_work(self):
for check in self.checks:
for work_unit in check.populate_work():
#work unit is a DB row
self.workQueue.put({"object" : check, "work" : work_unit})
threads = Thread(target=self.execute_work_unit)
threads = Thread(target=self.execute_work_unit)
threads.start()
self.workQueue.join();
def execute_work_unit(self):
unit = self.workQueue.get()
check_object = unit['object'] #Check object
work_row = unit['work'] # DB ROW
check_object.do_work(work_row)
self.workQueue.task_done();
print "Done with work!!"
输出只是:
Initializing thread manager...
In check1's do_work method... Doing work
Done with work!!
(locked up)
我想浏览整个队列
答案 0 :(得分:0)
你应该只在你的execute_work_unit中添加一个“while”,否则它会在第一次迭代时停止:
def execute_work_unit(self):
while True:
unit = self.workQueue.get()
check_object = unit['object'] #Check object
work_row = unit['work'] # DB ROW
check_object.do_work(work_row)
self.workQueue.task_done();
print "Done with work!!"
看看那里: http://docs.python.org/2/library/queue.html#module-Queue
编辑:要完成它只需在self.workQueue.join()之后添加threads.join() def kick_off_work(self):