亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

存儲管控系統中文件鎖的應用介紹

2023-08-08 01:27:23
25
0

背景

在(zai)進(jin)(jin)行存(cun)儲管(guan)(guan)控系統(tong)中(zhong)的塊(kuai)(kuai)存(cun)儲管(guan)(guan)理模塊(kuai)(kuai)開發時,塊(kuai)(kuai)存(cun)儲所(suo)需(xu)的數(shu)據(ju)需(xu)要從底層拉取并同步(bu)到管(guan)(guan)控系統(tong)的數(shu)據(ju)庫中(zhong),最終在(zai)頁(ye)面(mian)中(zhong)展示(shi)。系統(tong)設計了2種同步(bu)數(shu)據(ju)的方(fang)式(shi),一種是(shi)自動(dong)同步(bu):后臺創建一個(ge)(ge)定時任(ren)務(wu)(wu),每隔一段時間自動(dong)執行;另一種是(shi)頁(ye)面(mian)設置了同步(bu)按鈕(niu),用戶可隨時點(dian)擊進(jin)(jin)行同步(bu)。由于(yu)同步(bu)數(shu)據(ju)時間較長,所(suo)以存(cun)在(zai)當一個(ge)(ge)同步(bu)任(ren)務(wu)(wu)正在(zai)進(jin)(jin)行的時候,系統(tong)同時接(jie)收另一個(ge)(ge)同步(bu)請求。但同一時刻系統(tong)只(zhi)能(neng)執行一個(ge)(ge)數(shu)據(ju)同步(bu)任(ren)務(wu)(wu),否則(ze)會導致數(shu)據(ju)錯亂。這就需(xu)要用到文(wen)件鎖技術(shu)。

為什么要使用文件鎖?

存儲管控系(xi)統使用django-crontab庫實現定時任務,創建一個定時任務的簡單實現方式為(wei):

CRONJOBS = [
    ('10 22 * * *', 'ceph.views.rbd.volume_view.main_rbd_job', '>>/var/log/ecloudmon-web/cstor_rbd_sync_job.log')
]

創建完成后,python會在(zai)底(di)層操作系統使用crontab命(ming)令自動創建對(dui)應(ying)的定時任(ren)務,同時系統為該定時任(ren)務創建一(yi)個(ge)新的進程,且(qie)與(yu)python主程序(xu)不(bu)同。

定時任務執(zhi)行(xing)時本(ben)質上是(shi)對代碼(ma)文(wen)件(jian)進行(xing)讀(du)寫(xie),當python主程(cheng)(cheng)序同(tong)時文(wen)件(jian)同(tong)一個代碼(ma)文(wen)件(jian)時(并發(fa)),如果不進行(xing)加鎖處(chu)理,就會引(yin)發(fa)問題;而我們常用的threading lock主要是(shi)針對多線程(cheng)(cheng)并發(fa)進行(xing)處(chu)理,此種情況下并不適(shi)用。

文件(jian)鎖(suo)可以針對單個(ge)文件(jian)的(de)讀(du)寫進行加鎖(suo)處理,不(bu)管是多進程并(bing)發還(huan)是多線(xian)程并(bing)發,適用于此種(zhong)情(qing)況。

文件鎖在管控系統中的實現方式介紹 

  1. 引入模塊fcntl

   fcntl模塊是python標準(zhun)庫中自帶(dai)的,主(zhu)要(yao)針對Linux系統下的fcntl()接口。

import fcntl
  1. 使用fcntl

fcntl.flock(fd, operation)

   其中(zhong),fd為(wei)文件(jian)描述符(fu),operation為(wei)指定要進(jin)行的鎖操作,主要有以下取值:

  • LOCK_SH:  表示要創建一個共享鎖,在任意時間內,一個文件的共享鎖可以被多個進程擁有。
  • LOCK_EX:表示創建一個排它鎖,在任意時間內,一個文件的排它鎖只能被一個進程擁有
  • LOCK_UN:表示刪除該進程創建的鎖
  • LOCK_NB:如果指定此參數,函數不能獲得文件鎖就立即返回,否則,函數會等待獲得文件鎖。LOCK_NB可以同LOCK_SH或LOCK_NB進行按位或(|)運算操作。flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
  • LOCK_MAND:它主要是用于共享模式強制鎖,它可以與LOCK_READ或者LOCK_WRITE聯合起來使用,從而表示是否允許并發的讀操作或者并發的寫操作。
  1. 存儲管控系統中的應用

    在存(cun)儲管控系統中,數據同(tong)步任務(wu)在同(tong)一時(shi)間只能執行一次(ci),即文件只能被一個進程訪問(wen),所(suo)以使用(yong)(yong)了LOCK_EX,即排他鎖(suo)。同(tong)時(shi)組合(he)使用(yong)(yong)了LOCK_NB,使同(tong)步任務(wu)不具(ju)備執行條件時(shi)立即退出(chu)。實現的關鍵代碼如下(xia):

try:
    with open(BASE_DIR + "/rbd_sync_job.py", 'r') as f:
        fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
        get_rbd_info()
except Exception as e:
    log.info('rbd sync job is running for frontend!')
finally:
    f.close()

 

0條評論
0 / 1000
倪****闖
3文章數(shu)
0粉絲數
倪****闖
3 文章 | 0 粉絲
倪****闖
3文(wen)章數(shu)
0粉絲(si)數
倪****闖
3 文章 | 0 粉(fen)絲
原創

存儲管控系統中文件鎖的應用介紹

2023-08-08 01:27:23
25
0

背景

在(zai)(zai)進行(xing)(xing)存(cun)儲(chu)管(guan)控系(xi)(xi)統(tong)中(zhong)的塊(kuai)存(cun)儲(chu)管(guan)理模塊(kuai)開發時(shi)(shi),塊(kuai)存(cun)儲(chu)所(suo)需的數(shu)據(ju)(ju)需要(yao)從底層拉取并(bing)同(tong)(tong)(tong)(tong)步到管(guan)控系(xi)(xi)統(tong)的數(shu)據(ju)(ju)庫中(zhong),最終在(zai)(zai)頁面中(zhong)展示。系(xi)(xi)統(tong)設(she)計了2種同(tong)(tong)(tong)(tong)步數(shu)據(ju)(ju)的方(fang)式,一(yi)種是(shi)自動(dong)同(tong)(tong)(tong)(tong)步:后臺創建(jian)一(yi)個(ge)定(ding)時(shi)(shi)任(ren)(ren)務(wu),每隔(ge)一(yi)段時(shi)(shi)間自動(dong)執(zhi)行(xing)(xing);另一(yi)種是(shi)頁面設(she)置了同(tong)(tong)(tong)(tong)步按(an)鈕,用戶可隨時(shi)(shi)點擊(ji)進行(xing)(xing)同(tong)(tong)(tong)(tong)步。由于同(tong)(tong)(tong)(tong)步數(shu)據(ju)(ju)時(shi)(shi)間較長,所(suo)以存(cun)在(zai)(zai)當一(yi)個(ge)同(tong)(tong)(tong)(tong)步任(ren)(ren)務(wu)正在(zai)(zai)進行(xing)(xing)的時(shi)(shi)候(hou),系(xi)(xi)統(tong)同(tong)(tong)(tong)(tong)時(shi)(shi)接收另一(yi)個(ge)同(tong)(tong)(tong)(tong)步請求。但同(tong)(tong)(tong)(tong)一(yi)時(shi)(shi)刻系(xi)(xi)統(tong)只能執(zhi)行(xing)(xing)一(yi)個(ge)數(shu)據(ju)(ju)同(tong)(tong)(tong)(tong)步任(ren)(ren)務(wu),否則會(hui)導致數(shu)據(ju)(ju)錯(cuo)亂(luan)。這就需要(yao)用到文(wen)件(jian)鎖技術。

為什么要使用文件鎖?

存儲管控系統使(shi)用django-crontab庫實現定(ding)(ding)時(shi)(shi)任(ren)務(wu),創建一個定(ding)(ding)時(shi)(shi)任(ren)務(wu)的簡單實現方(fang)式為:

CRONJOBS = [
    ('10 22 * * *', 'ceph.views.rbd.volume_view.main_rbd_job', '>>/var/log/ecloudmon-web/cstor_rbd_sync_job.log')
]

創建完(wan)成后(hou),python會(hui)在底層操作系統(tong)使用(yong)crontab命令自動(dong)創建對(dui)應的(de)定(ding)時任(ren)務(wu),同時系統(tong)為該(gai)定(ding)時任(ren)務(wu)創建一個(ge)新的(de)進程,且與python主程序不同。

定(ding)時(shi)任務執行(xing)(xing)時(shi)本(ben)質上是對代碼文件進行(xing)(xing)讀寫(xie),當python主(zhu)(zhu)程序同時(shi)文件同一個代碼文件時(shi)(并(bing)發),如果不進行(xing)(xing)加鎖處理,就會引發問(wen)題;而我們常用的threading lock主(zhu)(zhu)要是針對多線程并(bing)發進行(xing)(xing)處理,此(ci)種(zhong)情況下并(bing)不適(shi)用。

文件鎖可以(yi)針(zhen)對單(dan)個(ge)文件的(de)讀(du)寫進行加鎖處(chu)理,不管是(shi)多進程(cheng)并發還是(shi)多線程(cheng)并發,適用(yong)于此種情況。

文件鎖在管控系統中的實現方式介紹 

  1. 引入模塊fcntl

   fcntl模塊(kuai)是(shi)python標準庫中自帶的(de),主要針對Linux系統下(xia)的(de)fcntl()接口(kou)。

import fcntl
  1. 使用fcntl

fcntl.flock(fd, operation)

   其中,fd為文(wen)件(jian)描述符,operation為指定要進行的鎖操作,主(zhu)要有以下取值:

  • LOCK_SH:  表示要創建一個共享鎖,在任意時間內,一個文件的共享鎖可以被多個進程擁有。
  • LOCK_EX:表示創建一個排它鎖,在任意時間內,一個文件的排它鎖只能被一個進程擁有
  • LOCK_UN:表示刪除該進程創建的鎖
  • LOCK_NB:如果指定此參數,函數不能獲得文件鎖就立即返回,否則,函數會等待獲得文件鎖。LOCK_NB可以同LOCK_SH或LOCK_NB進行按位或(|)運算操作。flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
  • LOCK_MAND:它主要是用于共享模式強制鎖,它可以與LOCK_READ或者LOCK_WRITE聯合起來使用,從而表示是否允許并發的讀操作或者并發的寫操作。
  1. 存儲管控系統中的應用

    在存儲管控系統中,數(shu)據(ju)同步(bu)任務在同一時(shi)間只(zhi)(zhi)能執行(xing)一次,即(ji)(ji)文件只(zhi)(zhi)能被(bei)一個進程訪問,所以使(shi)用了LOCK_EX,即(ji)(ji)排他(ta)鎖。同時(shi)組合使(shi)用了LOCK_NB,使(shi)同步(bu)任務不(bu)具(ju)備執行(xing)條件時(shi)立即(ji)(ji)退出(chu)。實現(xian)的(de)關(guan)鍵代碼如下:

try:
    with open(BASE_DIR + "/rbd_sync_job.py", 'r') as f:
        fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
        get_rbd_info()
except Exception as e:
    log.info('rbd sync job is running for frontend!')
finally:
    f.close()

 

文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0