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

python3使用python-redis-lock解決并發(fā)計算問題

 更新時間:2021年10月29日 09:20:01   作者:海洋的漁夫  
本文主要介紹了python3使用python-redis-lock解決并發(fā)計算問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

需求

我在最近的一個任務(wù)中,存在一個redis高并發(fā)計算多個客戶端接收預(yù)警信息的時長問題。

模型是首先模擬多個客戶端連接預(yù)警服務(wù)器集群,然后向預(yù)警服務(wù)集群發(fā)送告警信息。隨后預(yù)警服務(wù)集群將會向客戶端推送告警信息。

此時,我記錄了發(fā)送告警至預(yù)警集群的時間,并且在客戶端還會記錄接收到告警的時間。

我將這個時間都會記錄到redis中,那么此時就會有一個問題,當多個客戶端搶占式往redis 讀取數(shù)據(jù),計算,設(shè)置數(shù)據(jù),這個過程是會被相互覆蓋的。

13423234-740656156c7b55ea.png

可以從上面的截圖來看,多個不同的客戶端讀取redis的數(shù)據(jù),大部分讀取到了同一個數(shù)據(jù),導致計算錯誤。

導致問題的示意圖如下:

13423234-1fe4018d81e208cb.png

為了解決這個問題,則可以編寫一個redis的鎖,用來控制數(shù)據(jù)的并發(fā)讀取以及寫入。
在python redis庫默認只有樂觀鎖的一種寫法,在這里我再推薦使用一個庫python-redis-lock,使用這個庫對redis多個客戶端并發(fā)的情況加鎖,真的很方便。
下面來看看怎么使用。

python-redis-lock

https://pypi.org/project/python-redis-lock/

在使用這個庫之前,需要安裝如下:

pip install python-redis-lock

使用鎖的示例:

lock = redis_lock.Lock(conn, "name-of-the-lock")
if lock.acquire(blocking=False):
    print("Got the lock.")
    lock.release()
else:
    print("Someone else has the lock.")

上面是單獨設(shè)置鎖的方式,還可以單獨設(shè)置所有redis的操作加入鎖。

# On application start/restart
import redis_lock
redis_lock.reset_all(redis_client)

修改業(yè)務(wù)代碼,增加lock操作

1. 首先導入redis_lock

import redis_lock

2.將redis連接的客戶端傳入lock中,并設(shè)置lock的名稱

# 設(shè)置redis連接
self.conn = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True, db=3)
 
# 設(shè)置redis鎖
self.lock = redis_lock.Lock(self.conn, "redis-lock")

3.將業(yè)務(wù)讀取、設(shè)置redis的部分加入鎖

while True:
    # 設(shè)置redis鎖,操作redis
    if self.lock.acquire(blocking=False):
        print("Got the lock.")
        # 獲取lock,執(zhí)行業(yè)務(wù)處理
        # 獲取當前redis鐘記錄的客戶端接收到告警的總時長
        recv_time_sum_count_clients = self.conn.get(recv_time_sum_count_clients_key)
        if recv_time_sum_count_clients is None:
            recv_time_sum_count_clients = "0:0"
 
        # 獲取當前的統(tǒng)計數(shù)據(jù)
        recv_time_sum, count_clients = recv_time_sum_count_clients.split(":")
 
        # 計算告警接收總時長
        recv_time_sum = float(recv_time_sum) + recv_time
        # 計算收到預(yù)警的客戶端數(shù)量
        count_clients = int(count_clients) + 1
 
        # 寫入redis中
        recv_time_sum_count_clients = "%s:%s" % (str(recv_time_sum), str(count_clients))
        self.conn.set(recv_time_sum_count_clients_key, recv_time_sum_count_clients)
 
        print("user_id = %s, 計算平均時間成功, "
              "recv_time_sum = %s, count_clients = %s \n" %
              (self.user_id, recv_time_sum, count_clients))
 
        # 釋放lock
        self.lock.release()
 
        # 退出循環(huán)
        break
    else:
        print("Someone else has the lock.")            

在客戶端的代碼中設(shè)置了鎖之后,再來執(zhí)行一下,看看有無搶占讀取redis數(shù)據(jù)的情況,如下:

13423234-9050e8b9bca5abd7.png

設(shè)置了鎖之后,客戶端由于并發(fā)導致redis數(shù)據(jù)讀取、設(shè)置錯誤的情況就可以避免了。

并且這個庫還可以使用到Django框架中,更多細節(jié)讀者可以到該庫Github中細細查閱,本篇章就不介紹了,哈哈。

到此這篇關(guān)于python3使用python-redis-lock解決并發(fā)計算問題的文章就介紹到這了,更多相關(guān)python-redis-lock 并發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)給qq郵箱發(fā)送郵件的方法

    Python實現(xiàn)給qq郵箱發(fā)送郵件的方法

    這篇文章主要介紹了Python實現(xiàn)給qq郵箱發(fā)送郵件的方法,涉及Python郵件發(fā)送的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Python中一些深不見底的“坑”

    Python中一些深不見底的“坑”

    這篇文章主要給大家介紹了關(guān)于Python中一些深不見底的“坑”,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • tensorboard 可以顯示graph,卻不能顯示scalar的解決方式

    tensorboard 可以顯示graph,卻不能顯示scalar的解決方式

    今天小編就為大家分享一篇tensorboard 可以顯示graph,卻不能顯示scalar的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python調(diào)用java的Webservice示例

    python調(diào)用java的Webservice示例

    這篇文章主要介紹了python調(diào)用java的Webservice具體方法,包含java端和python實現(xiàn)代碼,需要的朋友可以參考下
    2014-03-03
  • Python日期的加減等操作的示例

    Python日期的加減等操作的示例

    本篇文章主要介紹了Python日期的加減等操作的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Python環(huán)境搭建過程從安裝到Hello World

    Python環(huán)境搭建過程從安裝到Hello World

    這篇文章主要介紹了Python環(huán)境搭建過程從安裝到Hello World,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • python中利用h5py模塊讀取h5文件中的主鍵方法

    python中利用h5py模塊讀取h5文件中的主鍵方法

    今天小編就為大家分享一篇python中利用h5py模塊讀取h5文件中的主鍵方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 淺談Pycharm調(diào)用同級目錄下的py腳本bug

    淺談Pycharm調(diào)用同級目錄下的py腳本bug

    今天小編就為大家分享一篇淺談Pycharm調(diào)用同級目錄下的py腳本bug,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python如何使用組合方式構(gòu)建復雜正則

    Python如何使用組合方式構(gòu)建復雜正則

    在Python中正則寫復雜了很麻煩,難寫難調(diào)試,其實只需要兩個函數(shù),就能用簡單正則組合構(gòu)建復雜正則,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • 利用python畫出折線圖

    利用python畫出折線圖

    這篇文章主要為大家詳細介紹了利用python畫出折線圖的相關(guān)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

沂源县| 资中县| 滁州市| 新昌县| 汕尾市| 清丰县| 儋州市| 房产| 吉水县| 民县| 营山县| 岑溪市| 平顶山市| 江川县| 威海市| 桓台县| 永顺县| 吉安市| 康乐县| 岐山县| 江陵县| 玉田县| 丹江口市| 留坝县| 娱乐| 腾冲县| 大化| 怀来县| 新余市| 滦平县| 墨玉县| 寻乌县| 如东县| 松滋市| 修水县| 简阳市| 玛曲县| 姜堰市| 普安县| 建阳市| 鄢陵县|