工作队列 Work Queues

之前的hello world只是简单了演示了一下生产 消费 队列的一个工作流程,但是实际上消费者并不能立刻马上的处理完消息,需要一定的处理过程,而且也不一定只有一个消费者。

本次工作队列就是演示这种情况:

  • 生产者生产多个消息。
  • 消费者处理消息,但是要有一定的处理时间。
  • 多个消费者进行处理。

RabbitMQ python演示 Work Queues_python

生产者代码

producer.py

import sys

message = ' '.join(sys.argv[1:]) or "Work Queues!"

credentials = pika.PlainCredentials(username="admin", password="admin") # 连接凭证 如果不指定 则默认使用 guest guest
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.0.191',
virtual_host='/',
credentials=credentials))
channel.queue_declare(queue='hello world') # 如果队列没有创建,就创建这个队列
channel.basic_publish(exchange='',
routing_key='hello world', # 指定队列的关键字为,这里是队列的名字
body=message) # 往队列里发的消息内容
msg = "Message '{}' has been sent to mq".format(message)
print(msg)

消费者代码

consumer.py

import pika
import time


def callback(ch, method, propertities,body):
print(" [x] Received %r" % body)
time.sleep(1) # 模拟处理消息所耗费的时间


# ########################### 消费者 ###########################
credentials = pika.PlainCredentials(username="admin", password="admin") # 连接凭证 默认为 guest
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.0.191',
virtual_host='/',
credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue='work queues') # 如果队列没有创建,就创建这个队列

channel.basic_consume("work queues", callback, auto_ack=True)
print(' [*] Waiting for message. To exit press CTRL+C')
channel.start_consuming()

验证方法

在过个终端运行消费者脚本,然后在另一终端多次执行生产者代码,每次都使用不同参数

RabbitMQ python演示 Work Queues_python_02

如图所示:

上方生产者,连续的发送消息到队列。

下方两个是消费者。由于有了一定的时间间隔,消息被两个消费者轮流的消费掉。至于轮询策略就是另一个话题了