pika详解(二) BlockingConnection
pika详解(二) BlockingConnection
BlockingConnection提供了最通用的连接方式
提供两个类: BlockingConnection 和 BlockingChannel
class BlockingConnection(object):
def __init__(self, parameters=None, _impl_class=None):
...
BlockingConnection是在pika异步的基础上提供的阻塞方法, 调用的是 AMQP协议的 Basic.Deliver and Basic.Return
在使用basic_consume接收消息, 使用basic_publish发送消息的时候仍然可以实现异步
为防止递归调用或者阻塞, blocking连接/channel 在上下文切换中实现 队列的asynchronously-delivered事件(异步通知事件), 比如在等待BlockingConnection.channel或 BlockingChannel.queue_declare时, 一旦实现嵌套的上下文, 将会同步(synchronously)调用它们, 这涉及到所有的回调函数:
1.lockingConnection.add_on_connection_blocked_callback,
2.BlockingConnection.add_on_connection_unblocked_callback, 3.BlockingChannel.basic_consume 等
避免死锁, 一直夯住: 但rabbitmq资源不足的时候, 当去连接rabbitmq的时候, rabbitmq会告诉客户端Connection.Blocked, 然后rabbitmq会暂停处理连接,直到有资源分配进行处理, 这会影响BlockingConnection和BlockingChannel
比如用户在basic_publish 使用非发布确认机制下, 遇上rabbitmq暂停处理连接,将会一直阻塞住,用户回调也不会被执行, 可能引起系统宕机, 解决办法是:
在BlockingConnection初始化时配置blocked_connection_timeout连接参数
类主要的函数方法及说明:
class BlockingConnection(object):
def __init__(self, parameters=None, _impl_class=None):
"""Create a new instance of the Connection object.
:param None | pika.connection.Parameters | sequence parameters:
Connection parameters instance or non-empty sequence of them. If
None, a `pika.connection.Parameters` instance will be created with
default settings. See `pika.AMQPConnectionWorkflow` for more
details about multiple parameter configurations and retries.
:param _impl_class: for tests/debugging only; implementation class;
None=default
:raises RuntimeError:
"""
def add_on_connection_blocked_callback(self, callback):
回调以便在连接被阻塞(从RabbitMQ接收到Connection.Blocked)时收到通知,
在这种状态下,RabbitMQ暂停处理传入数据,直到连接被解除阻塞,
因此接收此通知的发布者暂停发布直到连接被解除阻塞, 可以调用
ConnectionParameters.blocked_connection_timeout 添加超时
def add_on_connection_unblocked_callback(self, callback):
回调,以便在连接被解除阻塞时收到通知
def call_later(self, delay, callback):
pass
def add_callback_threadsafe(self, callback):
"""
connection.add_callback_threadsafe(
functools.partial(channel.basic_ack, delivery_tag=...))
"""
回调
def remove_timeout(self, timeout_id):
移除超时
def close(self, reply_code=200, reply_text='Normal shutdown'):
reply_code(int) - 关闭的代码
reply_text(str) - 关闭的文本原因
def process_data_events(self, time_limit=0):
pass
def sleep(self, duration):
延迟
def channel(self, channel_number=None):
建立channel通道 channel_number 整数 要使用的通道编号,默认为下一个可用通道编号
@property
def is_closed(self):
返回bool值
@property
def is_open(self):
返回bool值
@property
def basic_nack_supported(self):
返回bool值 , 指定服务器是否支持活动连接上的basic.nack
@property
def consumer_cancel_notify_supported(self):
返回bool值 服务器是否支持活动连接上的使用者取消通知
@property
def exchange_exchange_bindings_supported(self):
返回bool值 活动连接是否支持交换以交换绑定
@property
def publisher_confirms_supported(self):
返回bool值 活动连接是否可以使用发布者确认
BlockingChannel 通道
创建示例
import pika
# Create our connection object
connection = pika.BlockingConnection()
# The returned object will be a synchronous channel
channel = connection.channel()
参数:
class BlockingChannel(object):
def __init__(self, channel_impl, connection):
pass
@property
def channel_number(self):
"""Channel number"""
频道号码
@property
def connection(self):
"""The channel's BlockingConnection instance"""
@property
def is_closed(self):
是否关闭, 返回bool
@property
def is_open(self):
通道是否开启, 返回bool
def close(self, reply_code=0, reply_text="Normal shutdown"):
关闭
def flow(self, active):
关闭和打开通道流量控制。 active(bool) - 打开流程(True)或关闭(False)
def add_on_cancel_callback(self, callback):
一个回调函数,该函数将在代理发送Basic.Cancel时调用
callback -:callback(method_frame)其中method_frame类型
是pika.frame.Method类型的方法spec.Basic.Cancel
def add_on_return_callback(self, callback):
回调函数,该函数将在发布的消息被拒绝并由服务器通过Basic.Return返回时调用
callback(callable) - 使用callback(channel,method,properties,body),
其中channel:pika.Channel方法:
pika.spec.Basic.Return属性:pika.spec.BasicProperties body:bytes
def basic_consume(self,queue, on_message_callback, auto_ack=False,
exclusive=False, consumer_tag=None, arguments=None):
queue(str) - 要使用的队列
on_message_callback(可调用) -用于将消息分派给用户的必需函数,定义:
on_message_callback(channel, method,properties,body)
channel:BlockingChannel方法:spec.Basic.Deliver属性:
spec.BasicProperties body:bytes
auto_ack(bool) - 如果设置为True,将使用自动确认模式。
exclusive(bool) - 不允许队列中的其他消费者
consumer_tag(str) - 您可以指定自己的消费者标签; 如果留空,将自动生成消费者标签
arguments(dict) - 消费者的自定义键/值对参数
def basic_cancel(self, consumer_tag):
取消消费者
def start_consuming(self):
处理I / O事件并调度计时器和basic_consume 回调,直到取消所有使用者
def stop_consuming(self, consumer_tag=None):
取消所有使用者
- 1
- 2
def consume(self,queue,auto_ack=False,exclusive=False, arguments=None,
inactivity_timeout=None):
阻止队列消耗而不是通过回调。此方法是一个生成器,
它将每条消息都生成为方法,属性和正文的元组。当客户通过BlockingChannel.cancel()
或代理取消使用者时,活动生成器迭代器终止。
参数:
queue(str) - 要使用的队列名称
auto_ack(bool) - 告诉代理不要期待ack / nack响应
exclusive(bool) - 不允许队列中的其他消费者
arguments(dict) - 消费者的自定义键/值对参数
inactivity_timeout(float) - 如果给出一个数字(以秒为单位),将导致该方法在给定的
不活动时间后产生(None,None,None); 这允许用户在等待消息到达时执行伪常规维护活动。
如果给出 None(默认),则该方法将阻塞,直到下一个事件到达
def get_waiting_message_count(self):
返回可以通过BlockingChannel.consume从当前队列使用者生成器检索而不阻塞的消息数
def cancel(self):
def basic_ack(self, delivery_tag=0, multiple=False):
确认一条或多条消息。当客户端发送时,此方法确认通过Deliver或Get-Ok方法传递的一条或多条消息。
当由服务器发送时,此方法确认在确认模式下在通道上使用“发布”方法发布的一条或多条消息。
确认可以是针对单个消息或一组消息,包括特定消息。
参数:
delivery-tag(int) - 服务器分配的传递标记
multiple(bool) - 如果设置为True,则将传递标记视为“最多并包含”,
以便可以使用单个方法确认多个消息。
如果设置为False,则传递标记引用单个邮件。如果多个字段为1,并且传递标记为零,
则表示确认所有未完成的消息。
def basic_nack(self, delivery_tag=None, multiple=False, requeue=True):
方法允许客户端拒绝一个或多个传入消息。它可用于中断和取消大量传入消息,
或将无法处理的消息返回到其原始队列。
参数:
delivery-tag(int) - 服务器分配的传递标记
multiple(bool) - 如果设置为True,则将传递标记视为“最多并包含”,
以便可以使用单个方法确认多个消息。
如果设置为False,则传递标记引用单个邮件。如果多个字段为1,并且传递标记为零,
则表示确认所有未完成的消息。
requeue(bool) - 如果requeue为true,服务器将尝试重新排队该消息。
如果requeue为false或重新排队尝试失败,则丢弃或删除消息。
def basic_get(self, queue, auto_ack=False):
从AMQP代理获取单个消息
参数:
queue(str) - 从中获取消息的队列名称
auto_ack(bool) - 告诉经纪人不要期待回复
def basic_publish(self,exchange, routing_key, body, properties=None, mandatory=False):
参数:
exchange(str) - 要发布的交流
routing_key(str) - 要绑定的路由键
body(字节) - 消息体; 如果没有身体,空字符串
properties(pika.spec.BasicProperties) - 消息属性
mandatory(bool) - 强制性标志
def basic_qos(self, prefetch_size=0, prefetch_count=0, global_qos=False):
指定服务质量
参数:
prefetch_size(int) - 该字段指定预取窗口大小。如果服务器的大小等于或小于可用的
预取大小(并且也属于其他预取限制),则它将提前发送消息。
可以设置为零,意味着“没有特定限制”,
尽管其他预取限制可能仍然适用。如果在使用者中设置了no-ack选项,则忽略prefetch-size。
prefetch_count(int) - 根据整个消息指定预取窗口。该字段可以与预取大小字段结合使用;
如果预取窗口(以及通道和连接级别的窗口)都允许,则只会提前发送消息。
如果在使用者中设置了no-ack选项,则忽略prefetch-count。
global_qos(bool) - QoS是否适用于频道上的所有消费者
def basic_recover(self, requeue=False):
此方法要求服务器重新传送指定通道上的所有未确认消息。可以重新传递零个或多个消息。
此方法替换异步Recover
def basic_reject(self, delivery_tag=None, requeue=True):
拒绝传入的消息。此方法允许客户端拒绝邮件。它可用于中断和取消大量传入消息,
或将无法处理的消息返回到其原始队列。
参数:
delivery-tag(int) - 服务器分配的传递标记
requeue(bool) - 如果requeue为true,服务器将尝试重新排队该消息。
如果requeue为false或重新排队尝试失败,则丢弃或删除消息。
def confirm_delivery(self):
启用RabbitMQ专有的确认模式
def exchange_declare(self,exchange,exchange_type='direct',passive=False,
durable=False,auto_delete=False,internal=False,arguments=None):
声明交换机
exchange(str) - 交换名称由这些字符的非空序列组成:
字母,数字,连字符,下划线,句点或冒号。
exchange_type(str) - 要使用的交换类型
passive(bool) - 执行声明或只是检查它是否存在
durable(bool) - 重启RabbitMQ
auto_delete(bool) - 当不再绑定队列时删除
internal(布尔) - 只能由其他交易所发布
arguments(dict) - 交换的自定义键/值对参数
def exchange_delete(self, exchange=None, if_unused=False):
交换机删除
def exchange_bind(self, destination, source, routing_key='',arguments=None):
交换机绑定
destination(str) - 要绑定的目标交换
source(str) - 要绑定的源交换
routing_key(str) - 要绑定的路由键
arguments(dict) - 绑定的自定义键/值对参数
def exchange_unbind(self,destination=None,source=None,routing_key='',
arguments=None):
取消绑定
def queue_declare(self,queue, passive=False, durable=False, exclusive=False,
auto_delete=False, arguments=None):
声明队列,
queue(str) - 队列名称; 如果为空字符串,则代理将创建唯一的队列名称
passive(bool) - 只检查队列是否存在,如果不存在则引发 ChannelClosed
durable(bool) - 经纪人重新开始
exclusive(bool) - 仅允许当前连接访问
auto_delete(bool) - 消费者取消或断开连接后删除
arguments(dict) - 队列的自定义键/值参数
def queue_delete(self, queue, if_unused=False, if_empty=False):
删除队列
def queue_purge(self, queue):
清除指定队列中的所有消息 queue清除的队列的名称
def queue_bind(self, queue, exchange, routing_key=None, arguments=None):
将队列绑定到指定的交换
参数:
queue(str) - 绑定到交换的队列
exchange(str) - 要绑定的源交换
routing_key(str) - 要绑定的路由键
arguments(dict) - 绑定的自定义键/值对参数
def queue_unbind(self,queue,exchange=None,routing_key=None,arguments=None):
从交换中取消绑定队列
queue(str) - 从交换中取消绑定的队列
exchange(str) - 要绑定的源交换
routing_key(str) - 解除绑定的路由键
arguments(dict) - 绑定的自定义键/值对参数
def tx_select(self):
选择标准交易模式
def tx_commit(self):
事务提交
def tx_rollback(self):
事务回滚
pika详解(二) BlockingConnection的更多相关文章
- pika详解 (一)
pika详解 (一) 本文链接:https://blog.csdn.net/comprel/article/details/94592316 pika pika处理消息可以简单分为以下几个步骤: 我们 ...
- .NET DLL 保护措施详解(二)关于性能的测试
先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
- Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
[Android布局学习系列] 1.Android 布局学习之——Layout(布局)详解一 2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数) 3.And ...
- logback -- 配置详解 -- 二 -- <appender>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
- 爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- Android View 的绘制流程之 Layout 和 Draw 过程详解 (二)
View 的绘制系列文章: Android View 的绘制流程之 Measure 过程详解 (一) Android View 绘制流程之 DecorView 与 ViewRootImpl 在上一篇 ...
- HTTPS详解二:SSL / TLS 工作原理和详细握手过程
HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...
随机推荐
- String a=new String("abc")创建了几个对象
String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...
- 序列化 pickle模块
1. pickle 简介 2. pickle 核心函数 3. pickle 高级 -- 复杂对象 1. 持久化与 pickle 简介 1.1 什么是持久化? 持久化的基本思想很简单.假定有一个 Pyt ...
- web前端的超神之路
前端超神之路 前端基础知识 HTML :用户实现页面的工具 CSS:用于美化界面的工具 javascript:用于操作html元素和css样式,让你的页面效果更美观 前端进阶知识 jQuery:用于简 ...
- shellcode隐写到像素RGB免杀上线到CS
利用把Shellcode隐写到图片像素RGB进行免杀上线到CS --by:chenw 0x01 前言 前几天跟一个朋友一起搞一个站的时候,发现那个站点开了很多杀软,使用CS的powershell马无法 ...
- Word/Excel文档伪装病毒-kspoold.exe分析
一. 病毒样本基本信息 样本名称:kspoold.exe 样本大小: 285184 字节 样本MD5:CF36D2C3023138FE694FFE4666B4B1B2 病毒名称:Win32/Troja ...
- hdu1054 简单最小顶点覆盖
题意: 给你一些点,和一些边,如果把一个点安装保护装置,那么与他直接相连的点就可以被保护,题目问的是最少安装多少个点能让所有的点都被保护. 思路: 这是最基础的二分图最少定点覆 ...
- hdu4973 线段树(题目不错,用了点,段,更新查找还有DFS)
题意: 给你一个初始序列,初始序列长度n,分别为1 2 3 4 5 ....n,有两种操作 (1)D l r 把l_r之间的数据都复制一遍 1 2 3 4 5 6 D 2 4 = 1 2 ...
- 异步访问技术Ajax(XMLHttpRequest)
目录 AJAX XMLHttpRequest Ajax向服务器发送请求 Ajax接收服务器响应 AJAX - onreadystatechange 事件 使用 Callback 函数 一次Ajax请求 ...
- Intel汇编程序设计-整数算术指令(下)
7.5 扩展加法和减法 扩展精度的假发和减法是指任意尺寸大小数字的加法和减法.例如要求你写一个C++程序,把两个1024位的整数相加,解决方案可不是那么简单!但在汇编语言中,ADC(带进位加)指令和 ...
- 将HTML字符串编译为虚拟DOM对象的基础实现
本文所有代码均保存在HouyunCheng / mini-2vdom 虚拟DOM只是实现MVVM的一种方案,或者说是视图更新的一种策略,是实现最小化更新的diff算法的操作对象. 创建扫描器 所有编译 ...