作者

liangliangyy

猿来如此 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...
Linux 2019-05-31

一个基于QT的多媒体播放器

这个播放器是大学时候做的毕业设计,使用qt+phonon实现,支持音视频播放,支持同步显示歌词。是无意中在电脑里翻出了这个项目的源码,然后在ubuntu机器中安装了下环境编译之后竟然能够成功运行,看着这个界面和源码真是感慨良多,转眼已经毕业好几年了,真的是物是人非。。。
为了不让它在电脑继续里吃灰,还是分享出来,希望可以帮到可以用到的人吧,下面大体介绍下编译方式。

安装方式:

以ubuntu为例:

安装依赖

sudo apt update
#安装qt环境:
sudo apt install qt4* -y
sudo apt install qtcreator -y
#安装phonon
sudo apt install build-essential phonon phonon-backend-gstreamer  phonon4qt5 phonon4qt5-backend-gstreamer -y
#安装解码器
sudo apt install ubuntu-restricted-extras -y

编译

终端进入项目目录,执行:

#生成Makrfile文件
qmake Player.pro
#编译
make
#运行
./Player

至此,你就可以看到启动界面了。

主界面:

启动界面: 主界面如下图:

同步显示歌词:

说明

phonon

因为phononqt...

13973 12
猿来如此 2019-02-28

使用Django模版生成树状结构

我们经常会有这样的需求,比如评论功能,每个评论都有可能会有自己的子评论,如果在界面只展示成一列的话非常不美观,也不能体现出他们的层级关系。那么我们今天就来看看如何使用Django的模版来生成树状结构,以本站为例,效果如下图所示:

那么我们要怎么实现呢?首先先看看评论实体的定义,如下所示:

class Comment(models.Model):
    body = models.TextField('正文', max_length=300)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='作者', on_delete=models.CASCADE)
    article = models.ForeignKey(Article, verbose_name='文章', on_delete=models.CASCADE)
    parent_comment = models.ForeignKey('self', verbose_name="上级评论", blank=True, null=True, on_delete=models.CASCADE)

可以看到,有一个parent_comment字段,关联自己。这样就可以根据这个字段来生成层级关系。 为了方便我们使用,我们自定义了...

13031 25
发现更多