2013-05-09 50 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 2013-05-09 12:31:36

+5

这不是您的根本问题的答案,但我感到有必要指出,您的问题中的“import”语句会相互覆盖。如果使用上面编写的代码,'multi_q'和'normal_q'将是常规的'Queue.Queue'实例。为了使它工作,您需要只导入模块并为类使用完全限定的名称(例如'multi_q = multiprocessing.Queue()')或使用'as'关键字以不同的名称导入它们(例如'from Queue导入队列为qQueue')。 – Blckknght 2013-05-09 12:55:50

回答

1

有清除multiprocessing.Queue的没有直接的方法。

我相信你最接近的是close(),但这只是表明没有更多的数据将被推送到该队列,并将关闭它,当所有数据已被刷新到管道。

+0

感谢您的回复,我试图使用close(),但问题是我有一个while循环为: while not someQueue.empty(): do something end process 所以我想从其他进程清理队列,while循环结束。但是如果我关闭队列,它会引发错误 – FelipeG 2013-05-09 12:35:47

32

所以,我拿一下Queue类,你可以试试下面的代码:

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

这个技巧很有效,你的答案是正确的。 – Raoul 2013-06-23 22:59:57

+12

'while some_queue.empty():'更多pythonic – Jonathan 2013-12-21 21:42:06

+2

这个答案应该被挑选出来,因为它实际上提供了一个解决方案,而不是仅仅说“没有直接的方法来做这件事”。 – exfizik 2015-01-19 18:20:05

1

是一个内置类缺少需要的方法?创建内置类的子类,并添加您认为应该在那里的方法!

from Queue import Queue, Empty 

class ClearableQueue(Queue): 

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

ClearableQueue类继承的内置Queue类,并让您现在想的方法的所有善良(和行为)。

在您使用q = Queue()的所有地方只需使用q = ClearableQueue(),并在需要时致电q.clear()

+0

此代码有一个错误,因为在Python中,get_nowait函数可以抛出Empty,即使队列已满(是的,真的)。 – 2017-08-15 23:35:24

+0

@GeoffreyIrving:我想我会考虑Python中的错误...不是我的示例代码!认真:你提到一个*记录*功能?或者你只是指出了这种方法返回时的竞争条件,有人可能在队列中推送了其他东西*。在这种情况下...嗯,是的,可能会发生。多线程处理就是这样。但是,在我提出的clear()实现中,这仍然不是一个错误。 – 2017-08-17 00:08:25