我尝试使用队列来运行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
但在队列中有三个项目......
答案 0 :(得分:0)
queue.empty
是一种方法;你需要打电话给它。这是当前的问题。
如果你创建了两个ThreadWorkers,你会发现他们正在共享他们的queue
。与其他语言不同,类级别的queue = Queue()
之类的赋值不会声明实例变量;它声明了一个类属性。要创建实例属性,您需要在self.queue = Queue()
方法中指定__init__
。在类级别不需要任何类型的属性声明。
最后,检查Queue
是否为空是非常容易出现竞争条件,因为它是否为空可能会在empty()
和get()
之间发生变化。通常最好只调用get
,如果队列为空,让get
等待put
。