标签

python

猿来如此 2019-08-23

RabbitMQ学习笔记之(三) 发送方确认机制

上篇文章中,我们介绍了消费端的确认,那么在生产者有没有确认机制呢?答案是有的。 参考我们发送消息的代码段:

channel.basic_publish(exchange='testexchange', routing_key='hello', body='Hello World!{}'.format(i),
                          mandatory=True,
                          properties=pika.BasicProperties(
                              delivery_mode=2,  # 消息持久化
                          ))

如果在发送方发出消息后,如果exchange写错了,或者没有任何队列绑定我们发送的exchange,那么在这时候发送方是对此浑然不知的,而rabbitmq为了解决这个问题下面介绍下。

生产者将信道设置成confirm(确认)模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一ID),这就使得生产者知晓消息已经正确到达了目的地了。如果消息和...

猿来如此 2019-08-23

RabbitMQ学习笔记之(二) 消费端的确认与拒绝

首先,我们先看下这样的业务场景,在消息发出后,Consumer接收到了生产者所发出的消息,但在Consumer突然出错崩溃,或者异常退出了,但是生产者消息已经发出来了,那么这个消息可能就会丢失,为了解决这样的问题,RabbitMQ引入了ack机制。 消费者在订阅队列时,可以指定autoAck参数,当autoAck等于false时,RabbitMQ会等待消费者显式地回复确认信号后才从内存(或者磁盘)中移去消息(实质上是先打上删除标记,之后再删除)。当autoAck等于true时,RabbitMQ会⾃自动把发送出去的消息置为确认, 然后从内存(或者磁盘)中删除,而不管消费者是否真正地消费到了这些消息。 当采用ack消息确认机制后,只要将autoAck设置为false。消费者就可以有足够的时间来处理消息,而不用担心消费过程中突然异常退出导致消息丢失的情况,因为RabbitMQ会一直持有消息,直到消费者调用basic.ack为止。在这种情况下,对于RabbitMQ来说,队列中的消息就可以分为两部分,一部分是等待发送给消费者的消息,另外一部分就是等待接收消费者确认的消息。那么如果在这个时候,消费者突然发生中断,在消费中的消息会怎么处理呢? 如果RabbitMQ一直没有接收到消费者的确认消息,并且消费者的连接已经关闭,那么RabbitMQ就会重新将让消息进入队列中,等待下一个消费者消费...

猿来如此 2019-08-22

RabbitMQ学习笔记之(一) 基本概念介绍

基本介绍

RabbitMQ, 是一个使用erlang编写的AMQP(高级消息队列协议)的服务实现. 简单来说, 就是一个功能强大的消息队列服务.流程上来说,是发消息者(producer)把消息放到队列(queue)中去,然后收消息者(consumer)从队列中取出消息. RabbitMQ在这个基本概念之上, 多做了一层抽象, 在发消息者队列之间, 加入了交换器 (Exchange). 这样发消息者队列就没有直接联系, 转而变成发消息者把消息给交换器, 交换器根据调度策略再把消息再给队列
rabbitmq中几个比价重要的概念如下: - Producer,生产者,创建消息,然后发布到rabbitmq中,消息一般可以包含两个部分:消息体(payload)和标签(label),消息体一般是带有业务逻辑结构的数据。 - Consumer,消费者,接收消息。消费者连接到rabbitmq服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息体,存入到队列中的消息只有消息体。 - Broker 消费中间件的服务节点。 - 交换机 生产者将消息发送到Exchange(交换器,通常也可以用大写的“X”来表示),由交换器将消息路由到一个或者多个队列中。如果路由不到,或许会返回给生产者,或许直接丢弃。

消息队列运转过程:

使用示例

下面介绍下python如何使用rabbitmq...

Python 2019-06-09

深入理解Python中的asyncio

asyncio介绍

熟悉c#的同学可能知道,在c#中可以很方便的使用asyncawait来实现异步编程,那么在python中应该怎么做呢,其实python也支持异步编程,一般使用asyncio这个库,下面介绍下什么是asyncio:

asyncio 是用来编写 并发 代码的库,使用async/await语法。 asyncio 被用作多个提供高性能Python异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。 asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

asyncio中的基本概念

可以看见,使用asyncio库我们也可以在python代码中使用asyncawait。在asyncio中,有四个基本概念,分别是:

Eventloop

Eventloop可以说是asyncio应用的核心,中央总控,Eventloop实例提供了注册、取消、执行任务和回调 的方法。 简单来说,就是我们可以把一些异步函数注册到这个事件循环上,事件循环回循环执行这些函数(每次只能执行一个),如果当前正在执行的函数在等待I/O返回,那么事件循环就会暂停它的执行去执行其他函数。当某个函数完成I/O后会恢复,等到下次循环到它的时候就会继续执行。

Coroutine

协程本质就是一个函数,

import asyncio
import time

asyn...
Python 2019-01-13

python中的协程

先介绍下什么是协程:

协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。

是不是有点没看懂,没事,我们下面会解释。要理解协程是什么,首先需要理解yield,这里简单介绍下,yield可以理解为生成器,yield item这行代码会产出一个值,提供给next(...)的调用方; 此外,还会作出让步,暂停执行生成器,让调用方继续工作,直到需要使用另一个值时再调用next()。调用方会从生成器中拉取值,但是在协程中,yield关键字一般是在表达式右边(如,data=yield),协程可以从调用方接收数据,也可以产出数据,下面看一个简单的例子:

>>> def simple_coroutine():
...     print('coroutine start')
...     x = yield
...     print('coroutine recive:',x)
...     
>>> my_co=simple_coroutine()
>>> my_co
<generator object simple_coroutine at 0x1085174f8>
>>> next(m...
Python 2018-11-18

函数装饰器和闭包

装饰器基础知识

装饰器是可调用对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。 假如有一个名为decorate的装饰器:

@decorate
def target():
    print('running target()')

上述代码的效果与下述写法一样:

def target():
    print('running target()')
target = decorate(target)

两种写法的最终结果一样:上述两个代码片段执行完毕后得到的target不一定是原来那个target函数,而是decorate(target)返回的函数。
严格来说,装饰器只是语法糖。装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样更方便,尤其是元编程(在运行时改变程序行为)时。
综上,装饰器的一大特征是,能把被装饰的函数替换为其他函数。第二个特性是,装饰器在加载模块时立即执行,这通常是在导入时(即python加载模块时。

闭包

闭包时指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。 参考下面函数:

def make_averager():
    series = []

    def averager(new_value):
       ...
发现更多