2013-05-09 5 views
9

Я просто хочу знать, как очистить очередь многопроцессорности в python, как обычная очередь python. Например:Как очистить многопроцессорную очередь в python

from multiprocessing import Queue # multiprocessing queue 
from Queue import Queue   # normal queue 

multi_q = Queue() 
normal_q = Queue() 
multi_q.clear()     # or multi_q.queue.clear() 

объект 'Очередь' не имеет атрибута 'ясный'

normal_q.queue.clear() # This is ok 
+0

Да, в случае нормальной очереди вы можете очистить его содержимое normal_q.queue.clear(). Однако мне нужно использовать многопроцессорную обработку. спасибо за ответ – FelipeG

+5

Это не ответ на ваш основной вопрос, но я вынужден указать, что операторы 'import' в вашем вопросе перезаписывают друг друга. Если вы используете код, который вы указали выше, оба 'multi_q' и' normal_q' будут регулярными экземплярами 'Queue.Queue'. Чтобы заставить его работать, вам нужно либо импортировать только модули, либо использовать полностью квалифицированные имена для классов (например, 'multi_q = multiprocessing.Queue()') или использовать ключевое слово 'as' для их импорта под разными именами (например,' from Queue импортировать очередь как qQueue'). – Blckknght

ответ

1

Там нет прямого способа очистки multiprocessing.Queue.

Я считаю, что ближайший у вас есть close(), но это просто говорит о том, что больше нет данных для этой очереди и будет закрыто, когда все данные будут сброшены в трубу.

+0

Спасибо за ответ, я попытался использовать функцию close(), но проблема в том, что у меня есть цикл while: while not someQueue.empty(): do something end process Так что я хочу очистить очередь от другого процесса, таким образом контур while завершается. но если я закрываю очередь, он вызывает ошибку – FelipeG

32

Итак, я беру взгляд на класс Queue, и вы можете попробовать этот код:

while not some_queue.empty(): 
    some_queue.get() # as docs say: Remove and return an item from the queue. 
+0

Этот трюк работает, и ваш ответ правильный. – Raoul

+12

'while not some_queue.empty():' больше pythonic – Jonathan

+2

Этот ответ должен был быть выбран, потому что на самом деле это решение, а не просто «нет прямого способа сделать это». – exfizik

1

Есть встроенный класс отсутствующего метод, который вы хотите? Подкласс встроенного класса и добавьте метод, который, по вашему мнению, должен быть там!

from Queue import Queue, Empty 

class ClearableQueue(Queue): 

    def clear(self): 
     try: 
      while True: 
       self.get_nowait() 
     except Empty: 
      pass 

Ваш ClearableQueue класс наследует все добро (и поведение) от встроенного Queue класса и имеет метод, который вы теперь хотите.

Просто используйте q = ClearableQueue() во всех местах, где вы использовали q = Queue(), и позвоните по телефону q.clear(), если хотите.

+0

Этот код имеет ошибку, потому что в Python функция 'get_nowait' может бросать' Empty', даже если очередь заполнена (да, действительно). –

+0

@GeoffreyIrving: Думаю, я бы подумал, что ошибка в Python ... не мой пример кода! Серьезно: вы упоминаете функцию * documented *? Или вы просто указываете условие гонки, которое * к моменту возвращения этого метода, кто-то, возможно, нажал что-то еще в очереди *. В этом случае ... ну да, это может случиться. Многопоточная обработка - вот так. Но это все еще не является ошибкой в ​​моей предлагаемой реализации 'clear()'. –

Смежные вопросы