2013-05-09 9 views
9

Po prostu chcę wiedzieć, jak wyczyścić kolejkę wieloprocesową w pythonie jak normalna kolejka Pythona. Na przykład:Jak wyczyścić kolejkę wieloprocesową w pythonie

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

obiekt 'kolejce' nie ma atrybutu 'jasny'

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

Tak, w przypadku normalnej kolejki można wyczyścić jej zawartość przez normal_q.queue.clear(). Jednak muszę użyć trybu wieloprocesorowego. dziękuję za odpowiedź – FelipeG

+5

Nie jest to odpowiedź na twoje podstawowe pytanie, ale czuję się zmuszony podkreślić, że stwierdzenia "import" w twoim tekście zastępują się nawzajem. Jeśli użyjesz kodu, który napisałeś powyżej, zarówno 'multi_q', jak i' normal_q' będą regularnymi instancjami 'Queue.Queue'. Aby to działało, musisz zaimportować tylko moduły i użyć w pełni kwalifikowanych nazw dla klas (np. 'Multi_q = multiprocessing.Queue()') lub użyć słowa kluczowego 'as' do importowania ich pod różnymi nazwami (np.' From Queue importuj kolejkę jako kolejkę qQue'). – Blckknght

Odpowiedz

1

nie ma bezpośredniego sposobu usuwania multiprocessing.Queue.

Uważam, że najbliższy jest close(), ale po prostu stwierdza, że ​​żadne dane nie zostaną przekazane do tej kolejki i zamknie je, gdy wszystkie dane zostaną przepłukane do potoku.

+0

Dzięki za odpowiedź, próbowałem użyć close(), ale problem polega na tym, że mam pętlę while: while not someQueue.empty(): do something end process Tak więc chcę wyczyścić kolejkę z innego procesu, a tym samym zakończyć pętlę while. ale jeśli zamknę kolejkę, spowoduje to błąd. – FelipeG

32

Więc biorę spojrzenie na klasy kolejki i można wypróbować ten kod:

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

Ta sztuczka działa, a twoja odpowiedź jest właściwa. – Raoul

+12

'while not some_queue.empty():' jest bardziej pythonic – Jonathan

+2

Ta odpowiedź powinna być wybrana, ponieważ w rzeczywistości zapewnia rozwiązanie, zamiast po prostu powiedzieć "nie ma bezpośredniego sposobu robienia tego". – exfizik

1

to wbudowany w klasie brakującej metody chcesz? Podklasuj klasę wbudowaną i dodaj metodę, która Twoim zdaniem powinna tam być!

from Queue import Queue, Empty 

class ClearableQueue(Queue): 

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

Twoja klasa ClearableQueue dziedziczy całą dobroć (i zachowanie) z wbudowanym Queue klasy i ma sposobu chcesz teraz.

Po prostu użyj q = ClearableQueue() we wszystkich miejscach, w których używałeś q = Queue() i dzwonisz pod numer q.clear(), kiedy chcesz.

+0

Ten kod ma błąd, ponieważ w Pythonie funkcja 'get_nowait' może wyrzucić' Empty', nawet jeśli kolejka jest pełna (tak, naprawdę). –

+0

@GeoffreyIrving: Myślę, że uważam, że błąd w Pythonie ... nie mój przykładowy kod! Poważnie: czy wspominałeś o * udokumentowanej * funkcji? A może właśnie zwracasz uwagę na warunki wyścigu, że * do czasu powrotu tej metody, ktoś może popchnął coś innego w kolejce *. W takim razie ... cóż, tak, to może się zdarzyć. Wielowątkowe przetwarzanie jest właśnie takie. Ale to nadal nie jest błąd w mojej proponowanej implementacji 'clear()'. –