zoukankan      html  css  js  c++  java
  • 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就可以满足需求了.

  • 相关阅读:
    考试心得 模拟18
    模拟17 题解
    模拟16 题解
    考试心得 模拟17
    模拟15 题解(waiting)
    BZOJ2653 middle 【主席树】【二分】*
    BZOJ3932 CQOI2015 任务查询系统 【主席树】
    与或 【线段树】 *
    BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*
    网络流--最大权闭合子图 *
  • 原文地址:https://www.cnblogs.com/gibbon/p/3061521.html
Copyright © 2011-2022 走看看