2013-05-09 20 views
9

Sadece python'da bir çok işlemli sıranın normal bir python kuyruğu gibi nasıl temizleneceğini bilmek istiyorum. Örneğin:Python'da çok işlemli bir kuyruk nasıl temizlenir

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() 

'Queue' nesne

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

Normal kuyruk durumunda, içeriğini normal_q.queue.clear() ile temizleyebilirsiniz. Ancak çok işlemcili bir tane kullanmam gerekiyor. cevabınız için teşekkürler. – FelipeG

+5

Bu, temel sorunuzu yanıtlamıyor, ancak sorunuzdaki 'import' ifadelerinin birbirinin üzerine yazıldığını belirtmek zorunda hissediyorum. Yukarıda yazdığınız kodu kullanırsanız, hem "multi_q" hem de "normal_q" normal "Queue.Queue" örnekleri olacaktır. Çalışmak için ya sadece modülleri içe aktarmanız ve sınıflar için tam nitelikli isimler kullanmanız gerekir (örneğin, 'multi_q = multiprocessing.Queue()') veya farklı isimler altında içe aktarmak için 'as' anahtar sözcüğünü kullanın (örn. QQueue' olarak ithalat kuyruğu). – Blckknght

cevap

1

'net' hayır niteliğini bir multiprocessing.Queue temizleyerek doğrudan bir yolu yoktur vardır.

Sahip olduğunuz en yakın olanın close() olduğuna inanıyorum, ancak bu, daha fazla verinin bu sıraya aktarılmayacağını belirtir ve tüm veriler boruya akıtıldığında onu kapatacaktır.

+0

Cevabınız için teşekkürler, close() kullanmayı denedim ama sorun şu ki: while not someQueue.empty(): do something end process Bu nedenle sırayı diğer işlemlerden temizlemek istiyorum, böylece while döngüsü biter. ama kuyruğu kapatırsam bir hata verir – FelipeG

32

Yani, Kuyruk sınıfta göz atın ve bu kodu denemek olabilir:

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

Bu hile işe yarar ve cevabınız doğru olanıdır. – Raoul

+12

'while some_queue.empty():' daha fazla pythonic – Jonathan

+2

Bu cevap aslında "bunu yapmanın doğrudan yolu yok" demek yerine bir çözüm sağladığından seçilmeliydi. – exfizik

1

mı yerleşik bir istediğiniz yöntemi eksik sınıfta? Yerleşik sınıfı alt sınıfı ve orada olması gerektiğini düşündüğünüz yöntemi ekleyin!

from Queue import Queue, Empty 

class ClearableQueue(Queue): 

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

Sizin ClearableQueue sınıfı artık istediğiniz Queue sınıfta yerleşik ve sahip yöntemin bütün iyilik (ve davranış) devralır.

q = Queue()'u kullandığınız tüm yerlerde q = ClearableQueue() kullanın ve istediğiniz zaman q.clear() numaralı telefonu arayın.

+0

Bu kod bir hatadır, çünkü Python'da 'get_nowait' işlevi, kuyruk doluysa bile 'boş' atabilir (evet, gerçekten). –

+0

@GeoffreyIrving: Python'da bir hata olduğunu düşünürüm ... benim örnek kodum değil! Cidden: * belgelenmiş * özellikten mi bahsediyorsunuz? Ya da sadece bu yöntemin geri döndüğü yarış koşuluna işaret ediyorsunuz, birisi sıraya başka bir şey itmiş olabilir *. Bu durumda ... evet, bu olabilir. Çok iş parçacıklı işlem böyle. Ama bu benim önerdiğim Clear() 'de hala bir hata değil. –