python redis 消息队列_Python的Flask框架应用调用Redis队列数据的方法

任务异步化打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容。

我们每天都在浏览网页,发送大大小小的请求给服务器。有时候,服务器接到了请求,会发现他也需要给另外的服务器发送请求,或者服务器也需要做另外一些事情,于是最初们发送的请求就被阻塞了,也就是要等待服务器完成其他的事情。

更多的时候,服务器做的额外事情,并不需要客户端等待,这时候就可以把这些额外的事情异步去做。从事异步任务的工具有很多。主要原理还是处理通知消息,针对通知消息通常采取是队列结构。生产和消费消息进行通信和业务实现。

生产消费与队列上述异步任务的实现,可以抽象为生产者消费模型。如同一个餐馆,厨师在做饭,吃货在吃饭。如果厨师做了很多,暂时卖不完,厨师就会休息;如果客户很多,厨师马不停蹄的忙碌,客户则需要慢慢等待。实现生产者和消费者的方式用很多,下面使用Python标准库Queue写个小例子:

import random

import time

from Queue import Queue

from threading import Thread

queue = Queue(10)

class Producer(Thread):

def run(self):

while True:

elem = random.randrange(9)

queue.put(elem)

print "厨师 {} 做了 {} 饭 --- 还剩 {} 饭没卖完".format(self.name, elem, queue.qsize())

time.sleep(random.random())

class Consumer(Thread):

def run(self):

while True:

elem = queue.get()

print "吃货{} 吃了 {} 饭 --- 还有 {} 饭可以吃".format(self.name, elem, queue.qsize())

time.sleep(random.random())

def main():

for i in range(3):

p = Producer()

p.start()

for i in range(2):

c = Consumer()

c.start()

if __name__ == '__main__':

main()

大概输出如下:

厨师 Thread-1 做了 1 饭 --- 还剩 1 饭没卖完

厨师 Thread-2 做了 8 饭 --- 还剩 2 饭没卖完

厨师 Thread-3 做了 3 饭 --- 还剩 3 饭没卖完

吃货Thread-4 吃了 1 饭 --- 还有 2 饭可以吃

吃货Thread-5 吃了 8 饭 --- 还有 1 饭可以吃

吃货Thread-4 吃了 3 饭 --- 还有 0 饭可以吃

厨师 Thread-1 做了 0 饭 --- 还剩 1 饭没卖完

厨师 Thread-2 做了 0 饭 --- 还剩 2 饭没卖完

厨师 Thread-1 做了 1 饭 --- 还剩 3 饭没卖完

厨师 Thread-1 做了 1 饭 --- 还剩 4 饭没卖完

吃货Thread-4 吃了 0 饭 --- 还有 3 饭可以吃

厨师 Thread-3 做了 3 饭 --- 还剩 4 饭没卖完

吃货Thread-5 吃了 0 饭 --- 还有 3 饭可以吃

吃货Thread-5 吃了 1 饭 --- 还有 2 饭可以吃

厨师 Thread-2 做了 8 饭 --- 还剩 3 饭没卖完

厨师 Thread-2 做了 8 饭 --- 还剩 4 饭没卖完

Redis 队列Python内置了一个好用的队列结构。我们也可以是用redis实现类似的操作。并做一个简单的异步任务。

Redis提供了两种方式来作消息队列。一个是使用生产者消费模式模式,另外一个方法就是发布订阅者模式。前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听。后者也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是ping的。

生产消费模式主要使用了redis提供的blpop获取队列数据,如果队列没有数据则阻塞等待,也就是监听。

import redis

class Task(object):

def __init__(self):

self.rcon = redis.StrictRedis(host='localhost', db=5)

self.queue = 'task:prodcons:queue'

def listen_task(self):

while True:

task = self.rcon.blpop(self.queue, 0)[1]

print "Task get", task

if __name__ == '__main__':

print 'listen task queue'

Task().listen_task()

发布订阅模式使用redis的pubsub功能,订阅者订阅频道,发布者发布消息到频道了,频道就是一个消息队列。

import redis

class Task(object):

def __init__(self):

self.rcon = redis.StrictRedis(host='localhost', db=5)

self.ps = self.rcon.pubsub()

self.ps.subscribe('task:pubsub:channel')

def listen_task(self):

for i in self.ps.listen():

if i['type'] == 'message':

print "Task get", i['data']

if __name__ == '__main__':

print 'listen task channel'

Task().listen_task()

Flask 入口我们分别实现了两种异步任务的后端服务,直接启动他们,就能监听redis队列或频道的消息了。简单的测试如下:

import redis

import random

import logging

from flask import Flask, redirect

app = Flask(__name__)

rcon = redis.StrictRedis(host='localhost', db=5)

prodcons_queue = 'task:prodcons:queue'

pubsub_channel = 'task:pubsub:channel'

@app.route('/')

def index():

html = """


Redis Message Queue


生产消费者模式



发布订阅者模式

"""

return html

@app.route('/prodcons')

def prodcons():

elem = random.randrange(10)

rcon.lpush(prodcons_queue, elem)

logging.info("lpush {} -- {}".format(prodcons_queue, elem))

return redirect('/')

@app.route('/pubsub')

def pubsub():

ps = rcon.pubsub()

ps.subscribe(pubsub_channel)

elem = random.randrange(10)

rcon.publish(pubsub_channel, elem)

return redirect('/')

if __name__ == '__main__':

app.run(debug=True)

启动脚本,使用

siege -c10 -r 5 http://127.0.0.1:5000/prodcons

siege -c10 -r 5 http://127.0.0.1:5000/pubsub

可以分别在监听的脚本输入中看到异步消息。在异步的任务中,可以执行一些耗时间的操作,当然目前这些做法并不知道异步的执行结果,如果需要知道异步的执行结果,可以考虑设计协程任务或者使用一些工具如RQ或者celery等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go ip过滤_用Go实现自己的爬虫

作者:Masamune在日常生活中,我们时常会遇到一些采集数据相关的需求,比如获取一些官方数据整理到excel表中进行统计,聚合一些网页新闻提高自己的阅读效率等等。虽然许多爬虫教程都是用python写的,但是我认为Go语言是比p…

Flume实战采集文件内容存入HDFS

1、flume安装目录下新建文件夹 example 2、在example下新建文件 log-hdfs.conf 内容如下: # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1#exec 指的是命令 # Describe/configure the source a1.sources.r1.type exec #F…

总结计算机语言的基本元素,认识程序设计中基本元素教案.doc

曲靖师院计算机科学与工程学院学生试讲教案表课题:认识程序中的基本元素 年级:高一 课时:1课时授课时间:20分钟 讲授者:秦巧林 指导教师:崔丽梅教学目标知识与技能1. 掌握计算机程序中常用的常量、变量、函…

python海龟绘图圆形_python之海龟绘图

1. 基本功能介绍 在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟&a…

PLSQL Developer导入csv文件到oracle

csv文件内容: 要导入的表结构 create table RPT_MONILUCE_2_P01 ( imsi NUMBER, road_line NUMBER, ci NUMBER, diff NUMBER, rn NUMBER, sdate DATE, report_id NUMBER(20) ) 步骤: 1、在csv第一行上增加…

erwin 不能输入中文_国产开源建模软件PDMan与国外商业建模软件ERwin的主要功能比较...

在数据库建模的过程中,我们经常会使用到ERwin或者Power Designer之类的建模软件,来构建我们的逻辑模型和物理模型。但是这类软件都属于商业软件,需要企业购买相应的许可证授权。有些时候,我们会在没有购买这类商业建模软件的环境下…

Confluence 6 workbox 通知包含了什么

当一个用户在 Confluence 中进行下面的操作的时候,workbox 将会显示为通知: 分享(Shares) 你的页面或者博客页面。 提及(Mentions) 你的页面,博客页面,回复或者任务。你 关注&#x…

已知一点经纬度,方位角,距离,求另一点经纬度

参考了博文:http://blog.csdn.net/pyx6119822/article/details/52298037 ------------------------------------------------ package hellotest;public class LonLatTest3 {/** 大地坐标系资料WGS-84 长半径a6378137 短半径b6356752.3142 扁率f1/298.2572236*//**…

计算机一级excel如何选择2个,2017年计算机一级excel操作题(2)

(3)建立和编辑图表选择工作簿中需要编辑的表单,为其添加图表,其具体操作如下:步骤1选取“电脑城日出货统计表”的“配件”和“所占比例”两列,选择【插入一图表】命令,在弹出的“图表向导”对话框“标准类型”的“图表…

python的基本语术_一起学python-彻底掌握专业术语“变量”的概念

昨天分享了笨方法学习编程,今天就让我们通过实战来接触python,掌握专业术语“变量”的概念吧 python 中的变量的基本概念和初中代数的方程式X的概念是一样的,只是在计算机程序当中这个X不仅仅可以代表一个数字,还可以代表一段文字…

lamp自动部署工具_Linux一键配置工具ezhttp介绍

简介: ezhttp是一个Linux一键配置工具,采用bash脚本语言编写。支持自动配置LAMP,LNMP,LNAMP环境,以前提供各种其它的配置工具,如自动配置swap,配置iptables等。项目托管在github,地址为https://github.com/centos-bz/e…

Maven错误

1、软件包javax.servlet不存在 解决办法: 从tomcat lib目录下拷贝一个servlet-api.jar的包到“JDK\jre\lib\ext”目录下 凡是出现找不到包的情况,都可以将找到的包放到JDK\jre\lib\ext下,然后再编译就能够通过。 有方法是在pom.xml中引用s…

我对计算机感兴趣作文300字,我想对电脑游戏说作文300字

电脑游戏呀!电脑游戏呀!我知道你被人们创造出来,是想给人们带来快乐,可你也给人们带来了不少烦恼呀!你可知道,自从爸爸迷上了你,就像是变了一个人似的……每天清晨,天还蒙蒙亮&#…

git设置全局账号密码_jenkins2.222使用之二、总体设置

构建前提:由于构建的时候是基于maven、git(码云)以及jdk1.8来的,所以这些都需要和jenkins安装在同一台服务器上面。全局工具配置:1、配置jdk系统管理-全局工具配置-jdk,配置如下:jdk版本可以配置多个,构建的时候&#…

Mybatis源码之(TypeAliasRegistry)TypeAlias别名实现机制

原文链接:http://blog.csdn.net/qq924862077/article/details/52612589 ---------------------------------- 在Mybatis编程中我们经常会用到将某个bean作为参数类型parameterType或者结果返回值类型ResultType,所以很多时候我们需要把完成的Bean的包名…

Java中Synchronized的用法

2019独角兽企业重金招聘Python工程师标准>>> 《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念…

concat特征融合_MSFNet:多重空间融合网络进行实时语义分割(北航和旷视联合提出)...

作者:Tom HardyDate:2020-02-01来源:MSFNet:多重空间融合网络进行实时语义分割(北航和旷视联合提出)原文链接:https://arxiv.org/abs/1911.07217主要内容实时语义分割是一项具有挑战性的任务,因…

wifi信号手机测试软件,专业的WiFi检测工具有哪些?如何解决wifi信号不好?

原标题:专业的WiFi检测工具有哪些?如何解决wifi信号不好?有朋友wifi测试软件有哪些?WiFi信号和声音一样,强弱都是可以测量的,检测WiFi的方法有很多,作为普通的家庭用户,我们有时需要…

python创建数组与列表_python基础(三):数组和列表

下面是小凰凰的简介,看下吧! 💗人生态度:珍惜时间,渴望学习,热爱音乐,把握命运,享受生活 💗学习技能:网络 -> 云计算运维 -> python全栈( 当前正在学习…

Mybatis之typeAlias配置的3种方法

原文链接&#xff1a;http://www.cnblogs.com/lxcmyf/p/6444120.html ------------------------------- 扩展阅读&#xff1a;http://blog.csdn.net/zengmingen/article/details/70163420 ------------------------------------ 1.定义别名&#xff1a; <typeAliases>…