Python 带队列的线程

Python Thread with Queue

我尝试让 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 sleeping:1

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

queue.empty是一种方法;你需要打电话给它。这是当务之急。

如果您创建两个 ThreadWorker,您会发现它们正在共享它们的 queue。与其他语言不同,class 级别的 queue = Queue() 之类的赋值不声明实例变量;它声明了一个 class 属性。要创建实例属性,您可以在 __init__ 方法中分配 self.queue = Queue()。不需要在 class 级别声明此属性的存在。

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