工作队列 Work Queues
之前的hello world只是简单了演示了一下生产 消费 队列的一个工作流程,但是实际上消费者并不能立刻马上的处理完消息,需要一定的处理过程,而且也不一定只有一个消费者。
本次工作队列就是演示这种情况:
- 生产者生产多个消息。
- 消费者处理消息,但是要有一定的处理时间。
- 多个消费者进行处理。
生产者代码
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()
验证方法
在过个终端运行消费者脚本,然后在另一终端多次执行生产者代码,每次都使用不同参数
如图所示:
上方生产者,连续的发送消息到队列。
下方两个是消费者。由于有了一定的时间间隔,消息被两个消费者轮流的消费掉。至于轮询策略就是另一个话题了