Python Queue.join()

时间:2014-11-29 09:13:32

标签: python queue

即使我没有将线程设置为守护进程,一旦queue.join()完成和解除阻塞,程序是否应该退出?

#!/usr/bin/python
import Queue
import threading
import time

class workerthread(threading.Thread):
        def __init__(self,queue):
                threading.Thread.__init__(self)
                self.queue=queue
        def run(self):
                print 'In Worker Class'
                while True:
                        counter=self.queue.get()
                        print 'Going to Sleep'
                        time.sleep(counter)
                        print ' I am up!'
                        self.queue.task_done()
queue=Queue.Queue()

for i in range(10):
        worker=workerthread(queue)
        print 'Going to Thread!'
        worker.daemon=True
        worker.start()
for j in range(10):
        queue.put(j)
queue.join()

任何帮助都将受到高度赞赏!

2 个答案:

答案 0 :(得分:12)

当您在主线程中调用queue.join()时,它所做的只是阻塞主线程,直到工作人员处理了队列中的所有内容。它不会停止继续执行无限循环的工作线程。

如果工作线程是非deamon,它们的继续执行会阻止程序停止,而不管主线程是否已完成。

答案 1 :(得分:0)

我遇到了这种情况,队列中的所有内容都已处理完,但主线程在Queue.task_done()处被阻塞,这里是代码块。

import queue
def test04():
    q = queue.Queue(10)
    for x in range(10):
        q.put(x)

    while q.not_empty:
        print('content--->',q.get())
        sleep(1)
    re = q.task_done()  
    print('state--->',re,'\n')
    q.join()
    print('over \n')

test04()