国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

對Python多線程讀寫文件加鎖的實例詳解

2020-02-16 00:37:14
字體:
來源:轉載
供稿:網友

Python的多線程在io方面比單線程還是有優勢,但是在多線程開發時,少不了對文件的讀寫操作。在管理多個線程對同一文件的讀寫操作時,就少不了文件鎖了。

使用fcntl

在linux下,python的標準庫有現成的文件鎖,來自于fcntl模塊。這個模塊提供了unix系統fcntl()和ioctl()的接口。

對于文件鎖的操作,主要需要使用 fcntl.flock(fd, operation)這個函數。

其中,參數 fd 表示文件描述符;參數 operation 指定要進行的鎖操作,該參數的取值有如下幾種:

LOCK_SH:表示要創建一個共享鎖,在任意時間內,一個文件的共享鎖可以被多個進程擁有

LOCK_EX:表示創建一個排他鎖,在任意時間內,一個文件的排他鎖只能被一個進程擁有

LOCK_UN:表示刪除該進程創建的鎖

LOCK_MAND:它主要是用于共享模式強制鎖,它可以與 LOCK_READ 或者 LOCK_WRITE聯合起來使用,從而表示是否允許并發的讀操作或者并發的寫操作

demo

import fcntlimport threadingimport time  def writetoTxt(txtFile): id = threading.currentThread().getName() with open(txtFile, 'a') as f:  fcntl.flock(f.fileno(), fcntl.LOCK_EX) #加鎖  print "{0} acquire lock".format(id)  f.write("write from {0} /r/n".format(id))  time.sleep(3) # 在with塊外,文件關閉,自動解鎖 print "{0} exit".format(id)  for i in range(5): myThread = threading.Thread(target=writetoTxt, args=("test.txt",)) myThread.start()

代碼運行期間,控制臺將依次打印哪個線程獲得了鎖,在對文件進行讀寫。

Thread-1 acquire lockThread-1 exitThread-2 acquire lockThread-2 exitThread-3 acquire lockThread-3 exitThread-5 acquire lockThread-5 exitThread-4 acquire lockThread-4 exit

小結

通過調用

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

對文件加鎖,如果有其他線程嘗試對test文件加鎖,會被阻塞。

當線程執行完畢的時候,鎖會自動釋放。或者也可以采取主動的方式解鎖:調用

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

函數, 對文件test解鎖

使用線程鎖

當多個線程共享一個數據的時候,必須要進行同步的控制,不然會出現不可預期的結果,即 “線程不安全”

線程同步能夠保證多個線程安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入一個狀態:鎖定/非鎖定。某個線程要更改共享數據時,先將其鎖定,此時資源的狀態為“鎖定”,其他線程不能更改;直到該線程釋放資源,將資源的狀態變成“非鎖定”,其他的線程才能再次鎖定該資源。互斥鎖保證了每次只有一個線程進行寫入操作,從而保證了多線程情況下數據的正確性。            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 白朗县| 延吉市| 潜江市| 内丘县| 忻城县| 安化县| 探索| 祥云县| 临邑县| 辉县市| 城固县| 奈曼旗| 丘北县| 黔西县| 普兰店市| 长岭县| 富锦市| 太谷县| 内丘县| 扬州市| 山西省| 湖南省| 汉沽区| 邹城市| 昔阳县| 康保县| 锡林郭勒盟| 广宗县| 祁门县| 龙岩市| 昌平区| 金昌市| 得荣县| 广元市| 壤塘县| 祁门县| 隆回县| 陈巴尔虎旗| 苏尼特左旗| 舟山市| 上高县|