最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的Flask框架應(yīng)用調(diào)用Redis隊列數(shù)據(jù)的方法

 更新時間:2016年06月06日 18:14:20   作者:人世間  
這里為大家?guī)鞵ython的Flask框架應(yīng)用調(diào)用Redis隊列數(shù)據(jù)的方法,從而能夠?qū)崿F(xiàn)異步無阻塞從而提高某些實時處理情況下程序的性能,需要的朋友可以參考下

任務(wù)異步化
打開瀏覽器,輸入地址,按下回車,打開了頁面。于是一個HTTP請求(request)就由客戶端發(fā)送到服務(wù)器,服務(wù)器處理請求,返回響應(yīng)(response)內(nèi)容。

我們每天都在瀏覽網(wǎng)頁,發(fā)送大大小小的請求給服務(wù)器。有時候,服務(wù)器接到了請求,會發(fā)現(xiàn)他也需要給另外的服務(wù)器發(fā)送請求,或者服務(wù)器也需要做另外一些事情,于是最初們發(fā)送的請求就被阻塞了,也就是要等待服務(wù)器完成其他的事情。

更多的時候,服務(wù)器做的額外事情,并不需要客戶端等待,這時候就可以把這些額外的事情異步去做。從事異步任務(wù)的工具有很多。主要原理還是處理通知消息,針對通知消息通常采取是隊列結(jié)構(gòu)。生產(chǎn)和消費消息進行通信和業(yè)務(wù)實現(xiàn)。

生產(chǎn)消費與隊列
上述異步任務(wù)的實現(xiàn),可以抽象為生產(chǎn)者消費模型。如同一個餐館,廚師在做飯,吃貨在吃飯。如果廚師做了很多,暫時賣不完,廚師就會休息;如果客戶很多,廚師馬不停蹄的忙碌,客戶則需要慢慢等待。實現(xiàn)生產(chǎn)者和消費者的方式用很多,下面使用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內(nèi)置了一個好用的隊列結(jié)構(gòu)。我們也可以是用redis實現(xiàn)類似的操作。并做一個簡單的異步任務(wù)。

Redis提供了兩種方式來作消息隊列。一個是使用生產(chǎn)者消費模式模式,另外一個方法就是發(fā)布訂閱者模式。前者會讓一個或者多個客戶端監(jiān)聽消息隊列,一旦消息到達,消費者馬上消費,誰先搶到算誰的,如果隊列里沒有消息,則消費者繼續(xù)監(jiān)聽。后者也是一個或多個客戶端訂閱消息頻道,只要發(fā)布者發(fā)布消息,所有訂閱者都能收到消息,訂閱者都是ping的。

生產(chǎn)消費模式
主要使用了redis提供的blpop獲取隊列數(shù)據(jù),如果隊列沒有數(shù)據(jù)則阻塞等待,也就是監(jiān)聽。

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()

發(fā)布訂閱模式
使用redis的pubsub功能,訂閱者訂閱頻道,發(fā)布者發(fā)布消息到頻道了,頻道就是一個消息隊列。

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 入口
我們分別實現(xiàn)了兩種異步任務(wù)的后端服務(wù),直接啟動他們,就能監(jiān)聽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 = """
<br>
<center><h3>Redis Message Queue</h3>
<br>
<a href="/prodcons">生產(chǎn)消費者模式</a>
<br>
<br>
<a href="/pubsub">發(fā)布訂閱者模式</a>
</center>
"""
  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

可以分別在監(jiān)聽的腳本輸入中看到異步消息。在異步的任務(wù)中,可以執(zhí)行一些耗時間的操作,當然目前這些做法并不知道異步的執(zhí)行結(jié)果,如果需要知道異步的執(zhí)行結(jié)果,可以考慮設(shè)計協(xié)程任務(wù)或者使用一些工具如RQ或者celery等。

相關(guān)文章

  • 關(guān)于Matplotlib繪制動態(tài)實時曲線的方法改進指南

    關(guān)于Matplotlib繪制動態(tài)實時曲線的方法改進指南

    這篇文章主要給大家介紹了關(guān)于Matplotlib繪制動態(tài)實時曲線的相關(guān)資料,matplotlib是python里最popular的畫圖工具,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-06-06
  • 解決python3 安裝不了PIL的問題

    解決python3 安裝不了PIL的問題

    今天小編就為大家分享一篇解決python3 安裝不了PIL的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python中numpy.pad()函數(shù)的使用詳解

    Python中numpy.pad()函數(shù)的使用詳解

    這篇文章主要介紹了Python中numpy.pad()函數(shù)的使用詳解,在卷積神經(jīng)網(wǎng)絡(luò)中,為了避免卷積運算導(dǎo)致輸出圖像縮小和圖像邊緣信息丟失,常常采用圖像邊緣填充技術(shù),即在圖像四周邊緣填充0,使得卷積運算后圖像大小不會縮小,同時也不會丟失邊緣和角落的信息,需要的朋友可以參考下
    2023-10-10
  • Python smallseg分詞用法實例分析

    Python smallseg分詞用法實例分析

    這篇文章主要介紹了Python smallseg分詞用法,以實例形式分析了Python實現(xiàn)分析的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Python并行計算庫Joblib高效使用指北

    Python并行計算庫Joblib高效使用指北

    Joblib是用于高效并行計算的Python開源庫,其提供了簡單易用的內(nèi)存映射和并行計算的工具,以將任務(wù)分發(fā)到多個工作進程中,這篇文章主要介紹了Python并行計算庫Joblib使用指北,需要的朋友可以參考下
    2024-08-08
  • 使用python操作lmdb對數(shù)據(jù)讀取的實例

    使用python操作lmdb對數(shù)據(jù)讀取的實例

    這篇文章主要介紹了使用python操作lmdb對數(shù)據(jù)讀取的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • python 微信好友特征數(shù)據(jù)分析及可視化

    python 微信好友特征數(shù)據(jù)分析及可視化

    這篇文章主要介紹了python 微信好友特征數(shù)據(jù)分析及可視化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-01-01
  • Python正則表達式如何進行字符串替換實例

    Python正則表達式如何進行字符串替換實例

    Python正則表達式在使用中會經(jīng)常應(yīng)用到字符串替換的代碼。這篇文章主要介紹了Python正則表達式如何進行字符串替換,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Python繪制股票移動均線的實例

    Python繪制股票移動均線的實例

    今天小編就為大家分享一篇Python繪制股票移動均線的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Django項目后臺不掛斷運行的方法

    Django項目后臺不掛斷運行的方法

    今天小編就為大家分享一篇Django項目后臺不掛斷運行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

三亚市| 石景山区| 恩施市| 抚松县| 锡林郭勒盟| 永顺县| 商河县| 新昌县| 且末县| 海口市| 宿松县| 确山县| 南安市| 海原县| 汝南县| 棋牌| 伊通| 鹿泉市| 马关县| 嘉荫县| 贵阳市| 中方县| 萝北县| 岑巩县| 新晃| 南昌市| 鞍山市| 新龙县| 永吉县| 秭归县| 凯里市| 城步| 合肥市| 泾源县| 伊通| 兴安盟| 南京市| 南城县| 即墨市| 奉化市| 金寨县|