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.pswp.cn/news/538669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538669.shtml
英文地址,請注明出處:http://en.pswp.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>…