欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python3使用python-redis-lock解決并發(fā)計(jì)算問(wèn)題

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

需求

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

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

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

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

13423234-740656156c7b55ea.png

可以從上面的截圖來(lái)看,多個(gè)不同的客戶端讀取redis的數(shù)據(jù),大部分讀取到了同一個(gè)數(shù)據(jù),導(dǎo)致計(jì)算錯(cuò)誤。

導(dǎo)致問(wèn)題的示意圖如下:

13423234-1fe4018d81e208cb.png

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

python-redis-lock

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

在使用這個(gè)庫(kù)之前,需要安裝如下:

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.")

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

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

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

1. 首先導(dǎo)入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ù)處理
        # 獲取當(dāng)前redis鐘記錄的客戶端接收到告警的總時(shí)長(zhǎng)
        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"
 
        # 獲取當(dāng)前的統(tǒng)計(jì)數(shù)據(jù)
        recv_time_sum, count_clients = recv_time_sum_count_clients.split(":")
 
        # 計(jì)算告警接收總時(shí)長(zhǎng)
        recv_time_sum = float(recv_time_sum) + recv_time
        # 計(jì)算收到預(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, 計(jì)算平均時(shí)間成功, "
              "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è)置了鎖之后,再來(lái)執(zhí)行一下,看看有無(wú)搶占讀取redis數(shù)據(jù)的情況,如下:

13423234-9050e8b9bca5abd7.png

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

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

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

相關(guān)文章

  • Java byte數(shù)組操縱方式代碼實(shí)例解析

    Java byte數(shù)組操縱方式代碼實(shí)例解析

    這篇文章主要介紹了Java byte數(shù)組操縱方式代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • python字符串切片及常用方法示例詳解

    python字符串切片及常用方法示例詳解

    這篇文章主要介紹了python字符串切片及常用方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Django外鍵(ForeignKey)操作以及related_name的作用詳解

    Django外鍵(ForeignKey)操作以及related_name的作用詳解

    這篇文章主要介紹了Django外鍵(ForeignKey)操作以及related_name的作用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解Python是如何實(shí)現(xiàn)issubclass的

    詳解Python是如何實(shí)現(xiàn)issubclass的

    這篇文章主要介紹了詳解Python是如何實(shí)現(xiàn)issubclass的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 在Linux上安裝Python的Flask框架和創(chuàng)建第一個(gè)app實(shí)例的教程

    在Linux上安裝Python的Flask框架和創(chuàng)建第一個(gè)app實(shí)例的教程

    這篇文章主要介紹了在Linux上安裝Python的Flask框架和創(chuàng)建第一個(gè)app實(shí)例,包括創(chuàng)建一個(gè)HTML模版和利用Jinja2模板引擎來(lái)做渲染的步驟,需要的朋友可以參考下
    2015-03-03
  • python中的turtle庫(kù)函數(shù)簡(jiǎn)單使用教程

    python中的turtle庫(kù)函數(shù)簡(jiǎn)單使用教程

    這篇文章主要介紹了python中的turtle庫(kù)函數(shù)簡(jiǎn)單使用教程。本文通過(guò)圖片的形式給大家展示的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • Python中私有屬性的定義方式

    Python中私有屬性的定義方式

    這篇文章主要介紹了Python中私有屬性的定義方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • python多線程多并發(fā)啟動(dòng)appium服務(wù)的實(shí)現(xiàn)

    python多線程多并發(fā)啟動(dòng)appium服務(wù)的實(shí)現(xiàn)

    使用Dos命令或者bat批處理來(lái)手動(dòng)啟動(dòng)appium服務(wù),啟動(dòng)效率低下,本文主要介紹了python多線程多并發(fā)啟動(dòng)appium服務(wù)的實(shí)現(xiàn),具有一定的 參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • python 將字符串轉(zhuǎn)換成字典dict

    python 將字符串轉(zhuǎn)換成字典dict

    將字符串轉(zhuǎn)化成字典dict類型?這個(gè)可以用python的標(biāo)準(zhǔn)庫(kù)simplejson 轉(zhuǎn)換為JSON格式。
    2013-03-03
  • Python中csv模塊的基本使用教程

    Python中csv模塊的基本使用教程

    csv文件使用逗號(hào)分割,是一種純文本格式,不能指定字體顏色等樣式,也不能指定單元格的寬高,不能合并單元格,沒(méi)有多個(gè)工作表等功能,可以使用Excel打,這篇文章主要給大家介紹了關(guān)于Python中csv模塊的基本使用教程,需要的朋友可以參考下
    2021-07-07

最新評(píng)論