2017-07-11 6 views
0

私はキューを使用しているdjangoアプリケーションを持っています。私はものを持っている別のスレッドで アイテムがあるのにキューが空です

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

は次のようにキューに追加される
DataThread.data_queue.put(msg) 

そして、それは今、この作品の下のファッション

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) 

DataThreadに消費されている

以下 python manage.py runserver(django自体を使用)を使用して実行したとき。 しかし、このアプリケーションを実行するために gunicornを使用すると動作しません。キューの空のチェックは空のチェックを返すので、キューのサイズをチェックしてキューに追加すると、ビルドが継続されます。

EDIT:キューが同じかどうかを確認しました。それらは同じメモリ位置を有する。また、これが役立つかどうかはわかりませんが、これらのスレッドはgunicornが起動する前に作成されています。私はこれをサイトカスタマイズで作っています。

答えて

0

したがって、gunicornはスレッドを作成するDjangoのWebサーバーとは異なり、複数のワーカープロセスを作成して作成するようです。上記の質問のすべてはgunicornフォークの前に行われているので、アドレス空間上のgunicorn forkのコピーはスレッドではなく、コピーされます。したがって、キューは同じ仮想アドレスに存在し、gunicornによって作成された各プロセスに存在し、データは新しく作成されたワーカープロセスの各キューに入れられます。しかし、消費またはQueue.get()は、発生したQueue.putが存在しない最初のプロセスでのみ発生します。
代わりにmultiprocessing.Queueを使用して修正しました。それは魅力のように働いた。

関連する問題