1. 程式人生 > >孤荷淩寒自學python第四十天python 的線程鎖RLock

孤荷淩寒自學python第四十天python 的線程鎖RLock

輸入 讀寫操作 代碼塊 沖突 初始 手寫 接下來 體驗 code

孤荷淩寒自學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