2017-01-31 3 views
3

例に見られるような標準的な手順(forループ)を使用して、マシンに使用されているメモリが大量にあります。私。キュー内のすべてのメッセージがメモリにロードされ、確認応答されたように見えます。このアプローチはhereです。キューはジェネレータであると仮定しました。rabbitpyメッセージループは大量のメモリを消費するようです

import rabbitpy 

with rabbitpy.Connection('amqp://guest:[email protected]:5672/%2f') as conn: 
    with conn.channel() as channel: 
     queue = rabbitpy.Queue(channel, 'example') 

     # Exit on CTRL-C 
     try: 
      # Consume the message 
      for message in queue: 
       message.pprint(True) 
       message.ack() 

     except KeyboardInterrupt: 
      print 'Exited consumer' 

は、今、私たちは.get()経由で一度に一つのメッセージを使用して、メッセージgetterに行けば、より少ないメモリ空腹のように見えます。しかし、私のコード(無限ループを使用して)は、待ち行列にメッセージがないときにコンシューマーが実行されるようにするために - ウェブコントロールパネルでうまく動作しますが、コンシューマーは表示されません。消費者として - これを修正するにはどうすればよいのですか?ウェブパネルで消費者を検出するようにしますか?

queue_read = rabbitpy.Queue(channel, QUEUE_NAME) 
while True: 
     body = queue_read.get() ## pop one at a time. 
     if body == None: 
       time.sleep(3)    
       continue 
     body.ack() 
     print " [x] OK - got a message" 

答えて

1

キューを消費するときには、prefetchプロパティを設定する必要があります。代わりに:

for message in queue: 
    # handle message 

代わりに試してみてください。

for message in queue.consume(prefetch=5): # or some other reasonable value 
    # handle message 

Queueクラスの__iter__方法はconsume方法自体に単純な呼び出しです。 get方法は、単にchannelのうちメッセージを引き出し、あなたが将来的に消費し続けるしようとしている場合は考えていない間

consume方法は、consuming状態にchannelを設定します。あなたがウェブパネルであなたのプロセスを見ていないのはなぜですか。

+0

私はライブラリを使用していません。単にソースコードを読み、この結論に達しました。私はテストし、それがあなたのニーズに合っていることを確認します。 –

関連する問題