一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用 fcntl 模塊對文件進行加解鎖

 古明地覺O_o 2023-02-02 發(fā)布于北京

當我們在讀寫文件的時候,如果該文件同時還被另一個進程操作,那么很容易出現(xiàn)混亂。這時候就需要加鎖了,正如操作數(shù)據(jù)庫表的時候需要加鎖一樣。

而 Python 提供了一個庫 fcntl,通過 fcntl.flock 函數(shù)即可實現(xiàn)對文件進行加鎖和解鎖。

注意:這個模塊目前不支持 Windows,我們只能在類 Unix 下使用。

fcntl.flock 接收兩個參數(shù),第一個參數(shù)是文件描述符,第二個參數(shù)是 operation。常見的 operation 如下:

1)fcntl.LOCK_SH:共享鎖,所有進程都可以對當前文件施加共享鎖;

2)fcntl.LOCK_EX:排鎖,只能有一個進程對當前文件施加排鎖,其他進程在施加的時候會阻塞;

3)fcntl.LOCK_UN:對加鎖文件進行解鎖;

4)fcntl.LOCK_MAND:共享模式強制鎖,可以和 LOCK_READ 或者 LOCK_WRITE 聯(lián)合起來使用,從而表示是否允許并發(fā)的讀操作或者并發(fā)的寫操作(基本不用);

5)fcntl.LOCK_NB:非阻塞鎖,如果指定此參數(shù),函數(shù)不能獲得文件鎖就立即返回;否則函數(shù)會等待獲得文件鎖,LOCK_NB 可以同 LOCK_SH、LOCK_EX 結(jié)合使用;

例如:如果一個文件設置了排他鎖:

fcntl.flock(f.fileno(), fcntl.LOCK_EX)

那么當其它進程在請求獲取這個鎖的時候就會一直阻塞在這里。

但如果和 LOCK_NB 結(jié)合起來使用:

fcntl.flock(f.fileno(), fcntl.LOCK_EX | fnctl.LOCK_NB)

那么其它進程在獲取不到鎖的時候就直接返回了。

需要注意的是,在給文件加鎖之前,一定要保證文件以相應的訪問模式打開。

比如共享鎖是讓所有進程對文件只有讀權(quán)限,那么在加共享鎖的時候要保證文件以讀方式打開;加上排他鎖的時候,文件要以可寫的形式打開。

下面舉例說明,由于 fcntl 不支持 Windows,我們在 Linux 上測試。

開啟一個終端,打開 1.txt 并加上排鎖,而一旦施加了排鎖,其它進程就不能再加鎖了(包括共享鎖)。

這里再開啟一個終端,測試一下:

進程 1 已經(jīng)施加了排他鎖,進程 2 再加鎖的話就會阻塞,不管是共享鎖還是排他鎖都會阻塞。

然后我們再回到進程 1,將鎖釋放掉。

再來看看進程 2:

此時已經(jīng)不再阻塞了,因為第一個終端把鎖解除了。

我們說設置了排他鎖的話,其它進程在獲取不到鎖的時候會阻塞,但如果和 fcntl.LOCK_NB 結(jié)合使用的話,在獲取不到鎖的時候會直接返回。

進程 1 釋放鎖之后,已經(jīng)被進程 2 獲取,此時進程 2 給文件施加了排他鎖,然后我們繼續(xù)嘗試在進程 1 獲取。

因為此時獲取不到鎖,所以直接返回,告訴我們資源不可用。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    91欧美亚洲精品在线观看| 老司机亚洲精品一区二区| 日本99精品在线观看| 欧美日韩一级aa大片| 亚洲国产av一二三区| 国产精品推荐在线一区| 很黄很污在线免费观看| 国产精品午夜小视频观看| 美女黄片大全在线观看| 亚洲精品成人综合色在线| 亚洲国产精品无遮挡羞羞| 欧美特色特黄一级大黄片| 一区二区三区日韩在线| 欧洲亚洲精品自拍偷拍| 色丁香之五月婷婷开心| 国产传媒中文字幕东京热| 日本精品中文字幕在线视频 | 一区二区三区亚洲天堂| 亚洲一区二区三区精选| 一区二区免费视频中文乱码国产| 老熟女露脸一二三四区| 亚洲人妻av中文字幕| 青青操日老女人的穴穴| 日韩免费午夜福利视频| 麻豆一区二区三区精品视频| 日本婷婷色大香蕉视频在线观看 | 91福利视频日本免费看看| 国产视频一区二区三区四区| 99久久精品免费看国产高清| 欧美日韩国产亚洲三级理论片 | 欧美一级内射一色桃子| 99视频精品免费视频| 国产中文另类天堂二区| 美国女大兵激情豪放视频播放| 午夜精品久久久免费视频| 千仞雪下面好爽好紧好湿全文| 久久综合日韩精品免费观看| 少妇人妻精品一区二区三区| 亚洲av日韩一区二区三区四区| 日韩一区二区三区在线欧洲| 日韩精品少妇人妻一区二区|