在python中编写面向对象的多线程作业\结果队列

时间:2013-12-10 17:23:16

标签: python multithreading queue multiprocessing

长期潜伏在这里。

我有一个线程控制器对象。此对象接受称为“检查”的其他对象。这些检查会提取符合其条件的数据库行。线程管理器轮询每个检查(询问它的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)

我想浏览整个队列

1 个答案:

答案 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):