Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用aioamqp同时从多个队列消费_Python_Rabbitmq_Python Asyncio - Fatal编程技术网

Python 使用aioamqp同时从多个队列消费

Python 使用aioamqp同时从多个队列消费,python,rabbitmq,python-asyncio,Python,Rabbitmq,Python Asyncio,是否可以使用带有aioamqp的一个通道同时使用多个队列 免责声明:我在项目问题跟踪器中创建了一个,但我真的想知道我所做的是否有意义。我认为AMQP协议中没有此功能(假设我对协议的理解是正确的) 如果您希望从队列中消费,则必须在频道上发出basic.consume呼叫。此调用所需的参数是queue\u name,它是一个“阻塞”(不是阻塞连接而是阻塞通道)调用,其中响应是来自队列的对象 长话短说:每个消费者在等待队列对象时都必须拥有对通道的独占访问权 好的,所以我最初的想法是错误的。在深入研究之

是否可以使用带有aioamqp的一个通道同时使用多个队列

免责声明:我在项目问题跟踪器中创建了一个,但我真的想知道我所做的是否有意义。

我认为AMQP协议中没有此功能(假设我对协议的理解是正确的)

如果您希望从队列中消费,则必须在频道上发出
basic.consume
呼叫。此调用所需的参数是
queue\u name
,它是一个“阻塞”(不是阻塞连接而是阻塞通道)调用,其中响应是来自队列的对象

长话短说:每个消费者在等待队列对象时都必须拥有对通道的独占访问权

好的,所以我最初的想法是错误的。在深入研究之后,我发现它实际上通过一个渠道支持多个消费者。但是,如果需要,它允许服务器设置其限制。不幸的是,我找不到关于RabbitMQ特定案例的任何信息。所以我假设没有这样的限制。总而言之:这是图书馆的问题

不过,解决方法仍然有效:只需为每个消费者创建一个频道。它应该可以正常工作。

这样就可以了:

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

免责声明:我是该库的作者

你说得对,我将并行打开多个频道,因为这是一种廉价的操作。谢谢非常确定RabbitMQ支持使用来自同一通道的多个队列。它们都会被发送到同一个回调中。@eandersson是的,我已经深入研究了AMQP规范,看起来你是对的。更新了答案。我已经创建了一个相关的问题,以防有人想插手。我决定放弃aioamqp,因为从bug跟踪器中的评论来看,作者对当前的API设计一点也不满意,有些事情很难做到。