日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

怎么样用 Python 实现读写锁

發(fā)布時(shí)間:2025/3/21 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么样用 Python 实现读写锁 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

起步

Python 提供的多線程模型中并沒有提供讀寫鎖,讀寫鎖相對(duì)于單純的互斥鎖,適用性更高,可以多個(gè)線程同時(shí)占用讀模式的讀寫鎖,但是只能一個(gè)線程占用寫模式的讀寫鎖。

通俗點(diǎn)說就是當(dāng)沒有寫鎖時(shí),就可以加讀鎖且任意線程可以同時(shí)加;而寫鎖只能有一個(gè)線程,且必須在沒有讀鎖時(shí)才能加上。

簡單的實(shí)現(xiàn)

import?threadingclass?RWlock(object):????def?__init__(self):????????self._lock?=?threading.Lock()????????self._extra?=?threading.Lock()????????self.read_num?=?0????def?read_acquire(self):????????with?self._extra:????????????self.read_num?+=?1????????????if?self.read_num?==?1:????????????????self._lock.acquire()????def?read_release(self):????????with?self._extra:????????????self.read_num?-=?1????????????if?self.read_num?==?0:????????????????self._lock.release()????def?write_acquire(self):????????self._lock.acquire()????def?write_release(self):????????self._lock.release()

這是讀寫鎖的一個(gè)簡單的實(shí)現(xiàn),self.read_num?用來保存獲得讀鎖的線程數(shù),這個(gè)屬性屬于臨界區(qū),對(duì)其操作也要加鎖,所以這里需要一個(gè)保護(hù)內(nèi)部數(shù)據(jù)的額外的鎖?self._extra?。

但是這個(gè)鎖是不公平的。理想情況下,線程獲得所的機(jī)會(huì)應(yīng)該是一樣的,不管線程是讀操作還是寫操作。而從上述代碼可以看到,讀請(qǐng)求都會(huì)立即設(shè)置?self.read_num += 1,不管有沒有獲得鎖,而寫請(qǐng)求想要獲得鎖還得等待?read_num為 0 。

所以這個(gè)就造成了只有鎖沒有被占用或者沒有讀請(qǐng)求時(shí),可以獲得寫權(quán)限。我們應(yīng)該想辦法避免讀模式鎖長期占用。

讀寫鎖的優(yōu)先級(jí)

讀寫鎖也有分 讀優(yōu)先 和 寫優(yōu)先。上面的代碼就屬于讀優(yōu)先。

如果要改成寫優(yōu)先,那就換成去記錄寫線程的引用計(jì)數(shù),讀和寫在同時(shí)競爭時(shí),可以讓寫線程增加寫的計(jì)數(shù),這樣可使讀線程的讀鎖一直獲取不到, 因?yàn)樽x線程要先判斷寫的引用計(jì)數(shù),若不為0,則等待其為 0,然后進(jìn)行讀。這部分代碼不羅列了。

但這樣顯然不夠靈活。我們不需要兩個(gè)相似的讀寫鎖類。我們希望重構(gòu)我們代碼,使它更強(qiáng)大。

改進(jìn)

為了能夠滿足自定義優(yōu)先級(jí)的讀寫鎖,要記錄等待的讀寫線程數(shù),并且需要兩個(gè)條件threading.Condition?用來處理哪方優(yōu)先的通知。計(jì)數(shù)引用可以擴(kuò)大語義:正數(shù):表示正在讀操作的線程數(shù),負(fù)數(shù):表示正在寫操作的線程數(shù)(最多-1)

在獲取讀操作時(shí),先然后判斷時(shí)候有等待的寫線程,沒有,進(jìn)行讀操作,有,則等待讀的計(jì)數(shù)加 1 后等待?Condition?通知;等待讀的計(jì)數(shù)減 1,計(jì)數(shù)引用加 1,繼續(xù)讀操作,若條件不成立,循環(huán)等待;

在獲取寫操作時(shí),若鎖沒有被占用,引用計(jì)數(shù)減 1,若被占用,等待寫線程數(shù)加 1,等待寫條件?Condition?的通知。

讀模式和寫模式的釋放都是一樣,需要根據(jù)判斷去通知對(duì)應(yīng)的?Condition:

class?RWLock(object):????def?__init__(self):????????self.lock?=?threading.Lock()????????self.rcond?=?threading.Condition(self.lock)????????self.wcond?=?threading.Condition(self.lock)????????self.read_waiter?=?0????#?等待獲取讀鎖的線程數(shù)????????self.write_waiter?=?0???#?等待獲取寫鎖的線程數(shù)????????self.state?=?0??????????#?正數(shù):表示正在讀操作的線程數(shù)???負(fù)數(shù):表示正在寫操作的線程數(shù)(最多-1)????????self.owners?=?[]????????#?正在操作的線程id集合????????self.write_first?=?True?#?默認(rèn)寫優(yōu)先,False表示讀優(yōu)先????def?write_acquire(self,?blocking=True):????????#?獲取寫鎖只有當(dāng)????????me?=?threading.get_ident()????????with?self.lock:????????????while?not?self._write_acquire(me):????????????????if?not?blocking:????????????????????return?False????????????????self.write_waiter?+=?1????????????????self.wcond.wait()????????????????self.write_waiter?-=?1????????return?True????def?_write_acquire(self,?me):????????#?獲取寫鎖只有當(dāng)鎖沒人占用,或者當(dāng)前線程已經(jīng)占用????????if?self.state?==?0?or?(self.state?<?0?and?me?in?self.owners):????????????self.state?-=?1????????????self.owners.append(me)????????????return?True????????if?self.state?>?0?and?me?in?self.owners:????????????raise?RuntimeError("cannot?recursively?wrlock?a?rdlocked?lock")????????return?False????def?read_acquire(self,?blocking=True):????????me?=?threading.get_ident()????????with?self.lock:????????????while?not?self._read_acquire(me):????????????????if?not?blocking:????????????????????return?False????????????????self.read_waiter?+=?1????????????????self.rcond.wait()????????????????self.read_waiter?-=?1????????return?True????def?_read_acquire(self,?me):????????if?self.state?<?0:????????????#?如果鎖被寫鎖占用????????????return?False????????if?not?self.write_waiter:????????????ok?=?True????????else:????????????ok?=?me?in?self.owners????????if?ok?or?not?self.write_first:????????????self.state?+=?1????????????self.owners.append(me)????????????return?True????????return?False????def?unlock(self):????????me?=?threading.get_ident()????????with?self.lock:????????????try:????????????????self.owners.remove(me)????????????except?ValueError:????????????????raise?RuntimeError("cannot?release?un-acquired?lock")????????????if?self.state?>?0:????????????????self.state?-=?1????????????else:????????????????self.state?+=?1????????????if?not?self.state:????????????????if?self.write_waiter?and?self.write_first:???#?如果有寫操作在等待(默認(rèn)寫優(yōu)先)????????????????????self.wcond.notify()????????????????elif?self.read_waiter:????????????????????self.rcond.notify_all()????????????????elif?self.write_waiter:????????????????????self.wcond.notify()????read_release?=?unlock????write_release?=?unlock


品略圖書館 http://www.pinlue.com/


轉(zhuǎn)載于:https://blog.51cto.com/14325182/2406001

總結(jié)

以上是生活随笔為你收集整理的怎么样用 Python 实现读写锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲综合在线观看视频 | 国产精品一区二区av日韩在线 | 国产不卡在线视频 | 免费成人深夜小野草 | 欧美激情视频在线观看 | 日本中文字幕有码 | 亚洲天堂五月 | 国产精品日日做人人爱 | 污视频网站免费在线观看 | jzzijzzij亚洲成熟少妇 | 日韩五十路 | 亚洲av成人精品午夜一区二区 | 黄色大全免费观看 | 日韩亚洲欧美一区二区三区 | 极品91| 黄色av免费看 | 爱上av| 都市激情久久 | 成人免费大片黄在线播放 | 蜜桃一区二区 | 九九热中文字幕 | 我们的生活第五季在线观看免费 | a v免费视频 | 看看黄色片 | 99re6在线观看 | 一级黄色毛毛片 | 亚洲视频一二区 | 毛片你懂的| 久久久午夜电影 | 欧美黄色性生活 | 中文字幕久久熟女蜜桃 | 极品粉嫩小仙女高潮喷水久久 | 激情五月色播五月 | 五月天亚洲综合 | 亚洲黄v| 成人中文视频 | 中文字幕无码人妻少妇免费 | 免播放器在线视频 | 国产免费aa| 中文字幕在线观看线人 | www日日日 | 日韩国产精品一区二区 | 骚虎视频在线观看 | 精品国产露脸精彩对白 | 自拍视频网站 | 色偷偷免费费视频在线 | 在线看片你懂得 | 成人做爰视频www网站小优视频 | 婷婷一区二区三区 | 成人在线免费高清视频 | 国产午夜性春猛交ⅹxxx | 91看片在线 | 国产原创91 | 成年人黄色录像 | 日韩每日更新 | 精品二三区 | 欧美18—19性高清hd4k | 久久久观看 | 中文字幕一二区 | 又嫩又硬又黄又爽的视频 | 亚洲天堂第一 | 日韩av在线电影 | av一起看香蕉 | 免费高清视频一区二区三区 | 国产精品免费看 | 日韩成人av网站 | 在线观看黄色av | 欧美深性狂猛ⅹxxx深喉 | 欧美精品一区二区三区三州 | 六月丁香色婷婷 | 国产又粗又黄 | 亚洲高清视频网站 | 精品国产99一区二区乱码综合 | 色www国产亚洲阿娇 自拍一区在线 | 奶水喷溅 在线播放 | 国产亚洲精品久久 | www视频免费观看 | 黄色小视频免费观看 | 青青草视频免费播放 | 日本少妇xxxxxx| 日韩一区二区欧美 | 亚洲h网站 | 欧美永久免费 | 日本久操视频 | 天堂а√在线最新版中文在线 | 奶波霸巨乳一二三区乳 | 特级毛片在线观看 | 91美女视频网站 | 波多野结衣一区二区三区四区 | 自拍第一页 | 一级黄色片在线免费观看 | 一二三四视频社区在线 | 成人在线观看91 | 日本黄色天堂 | 国产小视频91 | 欧美视频xxx| 欧美特黄一级 | 成人精品网| 欧美在线va|