2016-08-10 9 views

答えて

1

この機能は、AMQPプロトコルでは使用できません(私のプロトコルの理解が正しいと仮定して)。

キューから消費する場合は、チャネルでbasic.consumeコールを発行する必要があります。この呼び出しに必要な引数はqueue_nameです。これは、応答がキューからのオブジェクトである "ブロッキング"(接続をブロックしていないがチャネルをブロックしていない)呼び出しです。

短い説明:各コンシューマは、キューオブジェクトを待機している間にチャネルに排他的にアクセスする必要があります。

私の最初の考えは間違っていたので、 AMQPを掘り下げたところ、実際には1つのチャネルで複数のコンシューマーをサポートしていることが分かりました。ただし、必要に応じてサーバーが制限を設定できるようにします。残念ながら、私はRabbitMQの特定の事件についての情報を見つけることができませんでした。だから私はそのような制限がないと仮定します。全体的に、これは図書館の問題です。

ただし、回避策はまだ有効です。消費者ごとにチャネルを作成するだけです。それはうまくいくはずです。

作品 ammoo
+0

You'rの作者だけど、私はただで複数のチャネルを開きます。それは安い操作だからです。ありがとう!! –

+0

RabbitMQは、同じチャネルから複数のキューを消費することをサポートしています。彼らはすべて同じコールバックに配信されます。 – eandersson

+0

@eanderssonええ、私はAMQP仕様を掘り下げました。それはあなたが正しいと思われます。答えを更新しました。 – freakish

1

import asyncio 

from ammoo import connect 


async def consume(channel, queue_name): 
    async with channel.consume(queue_name, no_ack=True) as consumer: 
     async for message in consumer: 
      print('Message from {}: {}'.format(queue_name, message.body)) 
      if message.body == b'quit': 
       print('Consumer for queue {} quitting'.format(queue_name)) 
       break 


async def main(): 
    async with await connect('amqp://localhost/') as connection: 
     async with connection.channel() as channel: 
      await channel.declare_queue('queue_a') 
      await channel.declare_queue('queue_b') 

      await asyncio.gather(
       consume(channel, 'queue_a'), 
       consume(channel, 'queue_b') 
      ) 
      print('Both consumers are done') 



if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(main()) 

出力:

# python3 test.py 
Message from queue_a: b'hello queue a' 
Message from queue_b: b'hello queue b' 
Message from queue_a: b'quit' 
Consumer for queue queue_a quitting 
Message from queue_b: b'another message for queue b' 
Message from queue_b: b'quit' 
Consumer for queue queue_b quitting 
Both consumers are done 

免責事項:私は右のライブラリ

関連する問題