2017-07-11 2 views
0

Ich habe eine Django-App, in der ich Queue verwende.Warteschlange ist leer, obwohl es darin Elemente gibt

class DataThread (threading.Thread): 
    data_queue = Queue.Queue() 

In einem anderen Thread ich Sachen wie

unten in die Warteschlange wird hinzugefügt haben
DataThread.data_queue.put(msg) 

Und es in DataThread in der unten Art und Weise

while True: 
    self.sendMessagesFromQueue() 
    time.sleep(1) 
def sendMessagesFromQueue(self): 
    try: 
     while not DataThread.data_queue.empty(): 
      data = self.data_queue.get() 
      #Some processing logic 
    except Exception as e: 
     print str(e) 

nun diese Arbeiten verbraucht wird wenn ich es mit python manage.py runserver (mit Django selbst) ausführen. Aber es funktioniert nicht, wenn ich gunicorn verwende, um diese App zu starten. Da der Check der Warteschlange leer bleibt, wird er leer zurückgegeben, aber wenn ich die Warteschlangengröße an dem Standort überprüfe, den ich zur Warteschlange hinzufüge, baut er sich weiter auf.

EDIT: Ich habe sogar überprüft, ob die Warteschlangen gleich sind. Sie haben die gleichen Speicherorte. Ich bin mir auch nicht sicher, ob das hilft, aber diese Threads werden erstellt, bevor Gunicorn startet. Ich mache dies in einer Sitecustomize.

Antwort

0

So scheint es, dass Gunicorn Gabeln und erstellt mehrere Worker-Prozesse im Gegensatz zu Djangos Webserver, der nur Threads erstellt. Da die obige Frage vor den Gunicorn-Gabeln gestellt wird, kopiert die Gunicorn-Gabel den Adressraum, aber nicht die Threads. Daher werden die Warteschlangen an derselben virtuellen Adresse vorhanden sein und in jedem von gunicorn erstellten Prozess vorhanden sein, und die Daten werden in diesen neu erstellten Arbeitsprozessen in jede Warteschlange gestellt. Aber das Verbrauchen oder das Queue.get() geschieht nur in dem anfänglichen Prozess, in dem keine Queue.put statt findet.
Ich reparierte es mit multiprocessing.Queue stattdessen. Es hat wie ein Zauber funktioniert.

Verwandte Themen