• rabbitmq客户端pika一个channel消费多个queue


    我们知道rabbitmq在一个connection中可以声明多个channel, 一个channel可以供给一个线程来安全的使用, 而一个channel是可以同时从多个队列接收数据的,我们称为消费多个queue, 那么在python客户端pika中, 如果一个channel消费多个queue, 对不同的消费是否可以执行不同的callback呢? 为了验证这个, 写了这么一个测试代码

    test_queue_send.py

    # -*- coding: utf-8 -*-
    from packages.rabbit import tornado_conn
    import time
    import pika
    import uuid
    
    queue_name = 'queue1'
    
    def proc():
        global queue_name
        if queue_name == 'queue1':
            queue_name = 'queue2'
        else:
            queue_name = 'queue1'
        content = str(uuid.uuid4())
        print 'sent to', queue_name, 'content:', content
        tornado_conn.get_channel().basic_publish(
            exchange='',
            routing_key=queue_name,
            properties=pika.BasicProperties(
                content_type='application/octet-stream'
            ),
            body=content
        )
        tor = tornado_conn.TornadoConnection.instance()
        tor.add_timeout(3, proc)
        pass
    
    tor = tornado_conn.TornadoConnection.instance()
    tor.add_timeout(5, proc)
    tornado_conn.TornadoConnection.start()

    test_queue_receive.py

    # -*- coding: utf-8 -*-
    from packages.rabbit import tornado_conn
    
    def queue_1_receive(ch, metd, props, body):
        print 'queue_1_receive', metd.routing_key, 'received:', body
        pass
    
    
    def queue_2_receive(ch, metd, props, body):
        print 'queue_2_receive', metd.routing_key, 'received:', body
        pass
    
    
    def on_queue_1_declared(frame):
        tornado_conn.get_channel().basic_consume(
            queue_1_receive, 
            no_ack=True, 
            queue=frame.method.queue
        )
        pass
    
    
    def queue_1_declare():
        tornado_conn.get_channel().queue_declare(
            queue='queue1',
            exclusive=True, 
            auto_delete=True,
            callback=on_queue_1_declared
        )
        pass
    
    
    def on_queue_2_declared(frame):
        tornado_conn.get_channel().basic_consume(
            queue_2_receive, 
            no_ack=True, 
            queue=frame.method.queue
        )
        pass
    
    
    def queue_2_declare():
        tornado_conn.get_channel().queue_declare(
            queue='queue2',
            exclusive=True, 
            auto_delete=True,
            callback=on_queue_2_declared
        )
        pass
    
    
    tor = tornado_conn.TornadoConnection.instance()
    tor.add_callback(queue_1_declare)
    tor.add_callback(queue_2_declare)
    tornado_conn.TornadoConnection.start()

    然后先运行接收端, 再运行发送端, 结果验证了当一个channel同时消费多个queue时, 不同queue过来的数据可以执行不同的回调, 这样在python客户端中, 每个connection实际只需要开启一个channel就可以满足需求了.

  • 相关阅读:
    转载:linux or unit 连接 windows的远程桌面-rdesktop(略有修改)
    Excel技巧
    Linux实用配置(ubuntu)
    转载:VMware linux 虚拟机中修改MAC地址
    windows技巧
    cdoj1099
    hdu1160(问题)
    c#学习笔记
    hdu1176
    qsort(),sort() scanf();
  • 原文地址:https://www.cnblogs.com/gibbon/p/3061521.html
Copyright © 2020-2023  润新知