python使用rabbitMQ介绍二(工作队列模式)
一模式介绍
第一章节的生产-消费者模式,是非常简单的模式,一发一收。在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者。
队列模型:

这时mq实现了一下几个功能:
- rabbitmq循环调度,将消息循环发送给不同的消费者
- 消息确认机制。为了确保一个消息不会丢失,RabbitMQ支持消息的确认 , 一个 ack(acknowlegement) 是从消费者端发送一个确认去告诉RabbitMQ 消息已经接收了、处理了,RabbitMQ可以释放并删除掉了。如果一个消费者死掉了(channel关闭、connection关闭、或者TCP连接断开了)而没有发送ack,RabbitMQ 就会认为这个消息没有被消费者处理,并会重新发送到生产者的队列里,如果同时有另外一个消费者在线,rabbitmq将会将消息很快转发到另外一个消费者中。 那样的话你就能确保虽然一个消费者死掉,但消息不会丢失。 这个是没有超时的,当消费方(consumer)死掉后RabbitMQ会重新转发消息,即使处理这个消息需要很长很长时间也没有问题。消息的 acknowlegments 默认是打开的,在前面的例子中关闭了: no_ack = True . 现在删除这个标识 然后 发送一个 acknowledgment。
- 消息持久化,将消息写入硬盘中。
- 公平调度。在一个消费者未处理完一个消息之前不要分发新的消息给它,而是将这个新消息分发给另一个不是很忙的消费者进行处理。为了解决这个问题我们可以在消费者代码中使用 channel.basic.qos ( prefetch_count = 1 ),将消费者设置为公平调度。
二 代码示例
生产者:
#!/usr/bin/env python
import pika
import sys parameters = pika.ConnectionParameters(host='localhost')
connection = pika.BlockingConnection(parameters) channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True) for i in range(10):
message = 'Hello World: {}'.format(i)
channel.basic_publish(exchange='',
routing_key='task_queue',
body=message,
properties=pika.BasicProperties(delivery_mode=2))
print(" [x] Sent %r " % message) connection.close()
消费者:
#!/usr/bin/env python
import pika
import time parameters = pika.ConnectionParameters(host='localhost')
connection = pika.BlockingConnection(parameters)
channel = connection.channel() channel.queue_declare(queue='task_queue', durable=True)
print(' [*] Warting for messages. To exit press CTRL+C') def call_back(ch, method, properties, body):
print(" [x] Received %r" % body)
time.sleep(body.count(b'.'))
print(" [x] Done")
ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_qos(prefetch_count=1)
channel.basic_consume(call_back, queue='task_queue')
channel.start_consuming()
生产者打印输出:
Task:
[x] Sent 'Hello World: 0'
[x] Sent 'Hello World: 1'
[x] Sent 'Hello World: 2'
[x] Sent 'Hello World: 3'
[x] Sent 'Hello World: 4'
[x] Sent 'Hello World: 5'
[x] Sent 'Hello World: 6'
[x] Sent 'Hello World: 7'
[x] Sent 'Hello World: 8'
[x] Sent 'Hello World: 9'
woerk1输出:
[*] Warting for messages. To exit press CTRL+C [x] Received b'Hello World: 0' [x] Done [x] Received b'Hello World: 2' [x] Done [x] Received b'Hello World: 4' [x] Done [x] Received b'Hello World: 6' [x] Done [x] Received b'Hello World: 7' [x] Done [x] Received b'Hello World: 9' [x] Done
worker二输出:
[*] Warting for messages. To exit press CTRL+C
[x] Received b'Hello World: 1'
[x] Done
[x] Received b'Hello World: 3'
[x] Done
[x] Received b'Hello World: 5'
[x] Done
[x] Received b'Hello World: 8'
[x] Done
三 队列信息
在web管理页面,可以看到channel情况

在queue页面,可以看到

python使用rabbitMQ介绍二(工作队列模式)的更多相关文章
- python使用rabbitMQ介绍一(生产-消费者模式)
1 模式介绍 生产者-消费者模式是最简单的使用模式. 一个生产者P,给队列发送消息,一个消费者C来取队列的消息. 这里的队列长度不限,生产者和消费者都不用考虑队列的长度. 队列的模型图: 2 示例代码 ...
- python使用rabbitMQ介绍三(发布订阅模式)
一.模式介绍 在前面的例子中,消息直接发送到queue中. 现在介绍的模式,消息发送到exchange中,消费者把队列绑定到exchange上. 发布-订阅模式是把消息广播到每个消费者,每个消费者接收 ...
- python使用rabbitMQ介绍五(话题模式)
一.模式介绍 话题模式(Topic)基本思想和路由模式是一样的,只不过路由键支持模糊匹配,符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词 话题模式相当于消息的模糊匹配,或者按照正则匹配.其中 ...
- python使用rabbitMQ介绍四(路由模式)
一.模式介绍 路由模式,与发布-订阅模式一样,消息发送到exchange中,消费者把队列绑定到exchange上. 这种模式在exchange上添加添加了一个路由键(routing-key),生产者发 ...
- Python 操作rabbitmq中的confirm模式的错误
今天使用rabbitmq的confirm模式,书上介绍的是pika版本是0.9.6,但是我用的是别的版本,发现这样的错误 Traceback (most recent call last): Fil ...
- python - 操作RabbitMQ
python - 操作RabbitMQ 介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...
- ApacheCN Python 译文集(二)20211110 更新
Python 应用计算思维 零.序言 第一部分:计算思维导论 一.计算机科学基础 二.计算思维要素 三.理解算法和算法思维 四.理解逻辑推理 五.探究性问题分析 六.设计解决方案和解决流程 七.识别解 ...
- 【RabbitMQ学习之二】RabbitMQ四种交换机模式应用
环境 win7 rabbitmq-server-3.7.17 Erlang 22.1 一.概念1.队列队列用于临时存储消息和转发消息.队列类型有两种,即时队列和延时队列. 即时队列:队列中的消息会被立 ...
- 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用
进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...
随机推荐
- Android拦截并获取WebView内部POST请求参数
起因: 有些时候自家APP中嵌入的H5页面并不是自家的.但是很多时候又想在H5不知情的情况下获取H5内部请求的参数,这应该怎么做到呢? 带着这个疑问,就有了这篇博客. 实现过程: 方案一: 最开始想到 ...
- Expand命令行详解
使用Expand命令行可以在计算机没有安装Windows操作系统的情况下应用批处理文件和脚本: 虽然有多个基于Windows的工具可以压缩和解压缩文件(包括WinZip和WinRAR),但是必须有一个 ...
- Windows Server 2016-客户端加域端口汇总
简单对客户端加域端口做汇总操作,希望对大家有帮助. 之前有对服务端口做汇总,具体请参照:Windows Server 2016-Active Directory域服务端口汇总:http://blog. ...
- 题目:python 打印出如下图案(菱形):
# 题目:打印出如下图案(菱形): # # * # *** # ***** # ******* # ***** # *** # * nu = 1 # 开始值 k = 2 # 变量值 while nu ...
- 好程序员web前端分享CSS基础篇
学习目标 1.CSS简介 2.CSS语法 3.样式的创建 4.两种引入外部样式表的区别 5.样式表的优先级和作用域 6.CSS选择器 7.选择器的权重 8.浮动属性的简单应用 9.HTML.CSS注释 ...
- 使用清华开源镜像安装tensorflow
安装tensorflow时,如果使用直接安装速度相对较慢,采取清华大学的镜像会提高速度.GPU版本安装方法:pip install tensorflow-gpu==1.8 -i https://pyp ...
- 总结Java常用到的六个加密技术和代码
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- 百度APP移动端网络深度优化实践分享(二):网络连接优化篇
本文由百度技术团队“蔡锐”原创发表于“百度App技术”公众号,原题为<百度App网络深度优化系列<二>连接优化>,感谢原作者的无私分享. 一.前言 在<百度APP移动端网 ...
- N元模型
在自然语言处理的任务中,拼音纠错.机器翻译等任务都需要对某个句子的下一个单词进行预测,或者评估某个句子的概率大小.例如预测如下句子的下一个单词: Please turn your home work. ...
- Got permission denied while trying to connect to the Docker daemon socket at
添加新用户后执行docker命令由于没权限出现以下报错: ”Got permission denied while trying to connect to the Docker daemon soc ...