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
。
我尝试让 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
。