第一步:同样的,首先我们需要做的也是连接RabbitMQ,负责连接RabbitMQ的代码和send.py中的一样。download:RPC实战与核心原理
第二步:这一步需要做的也要确定队列的存在,我们可以执行多次queue_declare,但是无论执行多少次,将只创建一次队列
channel.queue_declare(queue='hello') #这个操作是幂等的
你肯定会问:为什么我们要再次声明队列呢,我们已经在send.py中声明过一次了啊,没错,如果你能确定队列已经存在了,完全没有必要重新再定义一次,比如send.py先运行了,那么队列肯定是存在的。
但问题的所在就在于,我们根本无法确定,到底是send.py先运行还是receive.py先运行,因此最保险的做法就是在两个程序中都定义上这一条,反正是如果队列已经有了就不会重新创建。
查看RabbitMQ有多少条消息,(授权用户)可以使用rabbitmqctl tool: $ sudo rabbitmqctl list_queues Listing queues ... hello 0 ...done.
第三步:比起发消息来说,从队列中收消息是更加复杂一点,它订阅一个callback函数到一个队列,一旦收到消息,这个callback函数就会被(Pika库)调用。此处我们就写一个简单的callback函数(只完成打印功能)
def callback(ch, method, properties, body): print(" [x] Received %r" % body)
第四步:我们需要告诉RabbitMQ,这个特殊的callback函数应该从我们的队列接收消息。
channel.basic_consume(callback, queue='hello', no_ack=True)
要想让上面这条命令正确执行,我们必须保证队列我们订阅的队列是存在的,幸运的是,我们很有信心,因为我们已经在上面创建了一个队列‒使用queue_declare。
no_ack参数将在后面描述
第五步:最后,我们进入一个无休止的循环,等待数据,并且在必要时运行回调callback
print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()