孤荷淩寒自學python第四十天python 的線程鎖RLock
(完整學習過程屏幕記錄視頻地址在文末,手寫筆記在文末)
因為研究同時在多線程中讀寫同一個文本文件引發沖突,所以使用Lock鎖嘗試同步,但居然沒有完全成功,於是今天進一步研究RLock鎖。
一、 得到RLock鎖對象
新的RLock鎖對象=threading.RLock()
使用RLock類的初始化方法之前,必須保證當前py文檔已聲明引用過threading模塊:
import threading
二、 RLock對象的主要方法
RLock對象有兩個主要的方法:
1
RLock鎖對象 . acquire()
當在指定線程的代碼塊中執行了鎖對象的acquire()方法,那麽,此線程將讓並行的其它線程處於暫停執行的等待狀態中,此線程將獨占運行。
2
RLock鎖對象 . release()
當正在獨占運行的線程執行了鎖對象的release()方法的時候,就是解除了鎖定操作,其它並行線程就可以繼續運行了。
三、 RLock鎖與Lock鎖對象的區別
Lock鎖在任何情況下,雖然可以在不同的線程間使用acquire-release對,但只能acquire一次之後就等待release,而不能多次使用acquire。
而RLock鎖解決了這一問題,當已經acquire之後,還可以再一次,再幾次acquire,只要後面同樣次數的release幾次即可。稱為可重入鎖或遞歸鎖。但封閉acquire-release對只能在同一線程中完成。
importthreading
fromdatetime import datetime
from time import sleep
def do():
strtime=str(datetime.now())
ret=lock.acquire()
print(ret)
ret=lock.acquire()
print(ret)
print(strtime)
ret=lock.release()
print(ret)
ret=lock.release()
print(ret)
lock=threading.RLock()
t1=threading.Thread(target=do)
t1.start()
t1.join()
運行結果:
True
True
2018-08-23 20:29:34.426639
None
None
四、 完善Lock測試代碼由RLock代替
修改後的代碼如下:
importthreading
fromdatetime import datetime
from time import sleep
strf=‘1.txt‘
def read():
n=3
while n:
sleep(2)
#print(lock.acquire(False))
#iflock.acquire(False):
lock2.acquire()
print(lock.acquire(True))
if notlock.acquire(True): #如果其它線程沒有處於鎖定執行狀態
with open(strf,‘r‘,encoding=‘utf-8‘) as f:
strtime=str(datetime.now())
lstA=f.readlines()
print(‘讀取‘,strtime,lstA,‘\n\n‘)
lock2.release()
n-=1
def write():
n=3
while n:
sleep(1)
lock.acquire()
#lock.acquire()
print(‘鎖的狀態:‘,lock.acquire(True))
if notlock2.acquire(True):
with open(strf,‘w‘,encoding=‘utf-8‘) as f:
strtime=str(datetime.now())
lstA=[‘寫入時間:‘,strtime]
print(lstA,‘\n\n‘)
f.writelines(lstA)
lock.release
n-=1
#lock.release
print(‘後來鎖的狀態:‘,lock.acquire(True))
if lock.acquire(True):
lock.release()
print(‘再後來鎖的狀態:‘,lock.acquire(True))
def main():
tread=threading.Thread(target=read)
twrite=threading.Thread(target=write)
twrite.start()
tread.start()
twrite.join()
tread.join()
print(‘主線程結束。‘)
if __name__==‘__main__‘:
lock=threading.RLock()
lock2=threading.RLock()
main()
經過測試,發現也無法解決讀寫沖突的問題,而且仍然程序被鎖死。
一些小的修改後,讀寫操作可以交替進行,然而,始終存在讀寫線程同時操作指定文件的情況,詳細歡迎看操作過程錄屏,萬分感謝能有高人給予指導。
一旦兩個線程同步操作指定的同一個文件,就會出現讀或寫失敗。
且不論“主線程結束”是否已經打印,會發現程序都已被 鎖死了。 Visual Studio Code基本上都會出現程序崩潰現象。
當然,不管 Lock鎖還是RLock鎖,如果不涉及磁盤文件操作,僅僅是對變量對象操作的話,一切又非常正常,所有線程同步工作都能完美完成。
接下來將研究下另一個功用更豐富的線程操作對象Event,看情況對於文件操作的同步來說又會如何。
——————————
今天整理的學習筆記完成,最後例行說明下我的自學思路:
根據過去多年我自學各種編程語言的經歷,認為只有真正體驗式,解決實際問題式的學習才會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6編程語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時還沒有網絡),有的只是一本舊書,在痛苦的自學摸索中,我找到適應自己零基礎的學習方法:首先是每讀書的一小節就作相應的手寫筆記,第二步就是上機測試每一個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試之後,將筆記改為電子版,形成最終的修訂好的正確無誤的學習筆記。
通過反復嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視頻課程,結果發現也許自己學歷果然太低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際情況並不了解的情況,況且學習者的個體也存在差異呢?當然更可怕的是收費課程的價格往往是自己難以承受的。
於是我的所有編程學習都改為了自學,繼續自己的三步學習筆記法的學習之路。
當然自學的最大問題是會走那麽多的彎路,沒有導師直接輸入式的教學來得直接,好在網絡給我們帶來無限搜索的機會,大家在網絡上的學習日誌帶給我們共享交流的機會,而QQ群等交流平臺、網絡社區的成立,我們可以一起自學,互相批評交流,也可以獲得更有效,更自主的自學成果。
於是我以人生已過半的年齡,決定繼續我的編程自學之路,開始學習python,只希望與大家共同交流,一個人的獨行是可怕的,只有一群人的共同前進才是有希望的。
誠摯期待您的交流分享批評指點!歡迎聯系我加入從零開始的自學聯盟。
這個時代互聯網成為了一種基礎設施的存在,於是本來在孤獨學習之路上的我們變得不再孤獨,因為網絡就是一個新的客廳,我們時刻都可以進行沙龍活動。
非常樂意能與大家一起交流自己自學心得和發現,更希望大家能夠對我學習過程中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社區時代帶來的好福利,我相信大家會的,是吧!
根據完全共享的精神,開源互助的理念,我的個人自學錄制過程是全部按4K高清視頻錄制的,從手寫筆記到驗證手寫筆記的上機操作過程全程錄制,但因為4K高清文件太大均超過5G以上,所以無法上傳至網絡,如有需要可聯系我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視頻。
我的學習過程錄像百度盤地址分享如下:(清晰度:1280x720)
鏈接:https://pan.baidu.com/s/1rCS0anwyai2zil1icngGCQ
提取碼:goqj
Bilibili:
https://www.bilibili.com/video/av38089793/
喜馬拉雅語音筆記:
https://www.ximalaya.com/keji/19103006/145423605
孤荷淩寒自學python第四十天python 的線程鎖RLock