2015-10-23 2 views
0

Я пытаюсь получить рабочий поток python с очередью. Но когда я ставлю любое значение в очередь, я не могу найти это значение в другом потоке.Python Thread with Queue

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 ОЧЕРЕДЬ спящая: 1

Но в очереди являются тремя объектами ....

+2

'queue.empty' - метод; вам нужно позвонить ему. Кроме того, проверка того, является ли очередь пустой, как правило, очень подвержена ошибкам для взаимодействия с ней; просто вызов 'get' менее склонен к условиям гонки. – user2357112

+0

@ user2357112 Пожалуйста, разместите это как ответ вместо комментария. – ppperry

+2

Также вы, вероятно, не хотите создавать атрибуты класса очереди и потока. –

ответ

0

queue.empty - это метод; вам нужно позвонить ему. Это немедленная проблема.

Если вы создадите два ThreadWorkers, вы обнаружите, что они делят свои queue s. В отличие от других языков, задание типа queue = Queue() на уровне класса не объявляет переменную экземпляра; он объявляет атрибут класса. Чтобы создать атрибут экземпляра, вы должны назначить self.queue = Queue() в методе __init__. Нет необходимости в каком-либо объявлении существования этого атрибута на уровне класса.

И, наконец, проверка того, является ли Queue пустым, очень подвержена условиям гонки, так как может ли он быть пустым, может измениться между и get(). Обычно лучше просто позвонить get, и пусть get ждет put, если очередь пуста.