带队列的Python线程

时间:2015-10-23 21:25:39

标签: python multithreading python-multithreading

我尝试使用队列来运行python线程。但是,当我把任何值放入队列时,我无法在其他线程中找到此值。

from Queue import Queue
from threading import Thread
import time
class ThreadWorker(object):
    verbose = True
    thread = None
    queue = Queue()

    def __init__(self, workerId, queueMaxSize = 50, emptyQueuewaitTime = 1):
        self.queue.maxsize = queueMaxSize
        self.thread = Thread(target=self.__work, args=(workerId, emptyQueuewaitTime))
        self.thread.setDaemon(True)
        self.thread.start()

    def __work(self, workerId, sl):
        while(True):
            if self.queue.empty:
                print '[THREAD_WORKER] id: {}, EMPTY QUEUE sleeping: {}'.format(workerId, sl)
                time.sleep(sl) 
                continue
            if self.verbose:
                print '[THREAD_WORKER] id: {}, queueSize: {}'.format(workerId, self.queue.qsize())
            d = self.queue.get()
            self.queue.task_done()

    def put(self, item, waitIfFull = True):
        self.queue.put(item, waitIfFull)
        if self.verbose:
            print "Add to queue, current queue size: {}".format(self.queue.qsize())

创建实例并填充队列......

t = ThreadWorker("t1")
t.put("item1")
t.put("item2")
t.put("item3")

名称为t1的线程输出为:[THREAD_WORKER] id:t1,EMPTY QUEUE sleep:1

但在队列中有三个项目......

1 个答案:

答案 0 :(得分:0)

queue.empty是一种方法;你需要打电话给它。这是当前的问题。

如果你创建了两个ThreadWorkers,你会发现他们正在共享他们的queue。与其他语言不同,类级别的queue = Queue()之类的赋值不会声明实例变量;它声明了一个类属性。要创建实例属性,您需要在self.queue = Queue()方法中指定__init__。在类级别不需要任何类型的属性声明。

最后,检查Queue是否为空是非常容易出现竞争条件,因为它是否为空可能会在empty()get()之间发生变化。通常最好只调用get,如果队列为空,让get等待put