pika详解(二) BlockingConnection

本文详细介绍了pika库中的BlockingConnection特性,它在pika异步接口基础上提供了阻塞模式。BlockingConnection和BlockingChannel提供了AMQP协议的Basic.Deliver和Basic.Return的阻塞实现。在使用basic_consume接收和basic_publish发送消息时,仍可实现异步操作。文章还讨论了如何在处理Connection.Blocked事件时避免死锁,并提到了在资源不足时设置blocked_connection_timeout参数的重要性,以防止因rabbitmq暂停处理连接导致的系统阻塞问题。
摘要由CSDN通过智能技术生成

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(se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值