亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python多線程編程(四):使用Lock互斥鎖

系統 2035 0

前面已經演示了Python:使用threading模塊實現多線程編程二兩種方式起線程和Python:使用threading模塊實現多線程編程三threading.Thread類的重要函數,這兩篇文章的示例都是演示了互不相干的獨立線程,現在我們考慮這樣一個問題:假設各個線程需要訪問同一公共資源,我們的代碼該怎么寫?

復制代碼 代碼如下:

'''
Created on 2012-9-8
?
@author: walfred
@module: thread.ThreadTest3
'''?
import threading?
import time?
?
counter = 0?
?
class MyThread(threading.Thread):?
??? def __init__(self):?
??????? threading.Thread.__init__(self)?
?
??? def run(self):?
??????? global counter?
??????? time.sleep(1);?
??????? counter += 1?
??????? print "I am %s, set counter:%s" % (self.name, counter)?
?
if __name__ == "__main__":?
??? for i in range(0, 200):?
??????? my_thread = MyThread()?
??????? my_thread.start()

解決上面的問題,我們興許會寫出這樣的代碼,我們假設跑200個線程,但是這200個線程都會去訪問counter這個公共資源,并對該資源進行處理(counter += 1),代碼看起來就是這個樣了,但是我們看下運行結果:

復制代碼 代碼如下:

I am Thread-69, set counter:64
I am Thread-73, set counter:66I am Thread-74, set counter:67I am Thread-75, set counter:68I am Thread-76, set counter:69I am Thread-78, set counter:70I am Thread-77, set counter:71I am Thread-58, set counter:72I am Thread-60, set counter:73I am Thread-62, set counter:74I am Thread-66,set counter:75I am Thread-70, set counter:76I am Thread-72, set counter:77I am Thread-79, set counter:78I am Thread-71, set counter:78

打印結果我只貼了一部分,從中我們已經看出了這個全局資源(counter)被搶占的情況,問題產生的原因就是沒有控制多個線程對同一資源的訪問,對數據造成破壞,使得線程運行的結果不可預期。這種現象稱為“線程不安全”。在開發過程中我們必須要避免這種情況,那怎么避免?這就用到了我們在綜述中提到的互斥鎖了。

互斥鎖概念

Python編程中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性。每個對象都對應于一個可稱為” 互斥鎖” 的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。在Python中我們使用threading模塊提供的Lock類。

我們對上面的程序進行整改,為此我們需要添加一個互斥鎖變量mutex = threading.Lock(),然后在爭奪資源的時候之前我們會先搶占這把鎖mutex.acquire(),對資源使用完成之后我們在釋放這把鎖mutex.release()。代碼如下:

復制代碼 代碼如下:

'''
Created on 2012-9-8
?
@author: walfred
@module: thread.ThreadTest4
'''?
?
import threading?
import time?
?
counter = 0?
mutex = threading.Lock()?
?
class MyThread(threading.Thread):?
??? def __init__(self):?
??????? threading.Thread.__init__(self)?
?
??? def run(self):?
??????? global counter, mutex?
??????? time.sleep(1);?
??????? if mutex.acquire():?
??????????? counter += 1?
??????????? print "I am %s, set counter:%s" % (self.name, counter)?
??????????? mutex.release()?
?
if __name__ == "__main__":?
??? for i in range(0, 100):?
??????? my_thread = MyThread()?
??????? my_thread.start()

同步阻塞

當一個線程調用Lock對象的acquire()方法獲得鎖時,這把鎖就進入“locked”狀態。因為每次只有一個線程1可以獲得鎖,所以如果此時另一個線程2試圖獲得這個鎖,該線程2就會變為“blo同步阻塞狀態。直到擁有鎖的線程1調用鎖的release()方法釋放鎖之后,該鎖進入“unlocked”狀態。線程調度程序從處于同步阻塞狀態的線程中選擇一個來獲得鎖,并使得該線程進入運行(running)狀態。

進一步考慮

通過對公共資源使用互斥鎖,這樣就簡單的到達了我們的目的,但是如果我們又遇到下面的情況:

遇到鎖嵌套的情況該怎么辦,這個嵌套是指當我一個線程在獲取臨界資源時,又需要再次獲取;
如果有多個公共資源,在線程間共享多個資源的時候,如果兩個線程分別占有一部分資源并且同時等待對方的資源;

上述這兩種情況會直接造成程序掛起,即死鎖,下面我們會談死鎖及可重入鎖RLock。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 80岁色老头69av | 国产精品综合在线 | 国产主播专区 | 欧美成人久久久 | 91尤物在线| 免费欧洲毛片a级视频老妇女 | 国产欧美日韩中文久久 | 欧美久久网 | 国产一级特黄高清在线大片 | 伊人色综合网一区二区三区 | 午夜dj影院在线视频观看完整 | 精品久久香蕉国产线看观看亚洲 | 欧美一区二区三区精品影视 | 免费乱理伦片在线观看老妇 | 香蕉在线影院 | 亚洲一在线 | 一级黄色毛片播放 | 欧美一级一极性活片免费观看 | 99热精品在线免费观看 | 国产精品久久久久久亚洲伦理 | 青青青青手机在线视频观看国产 | 国产精品网页 | 豆国产96在线 | 亚洲 | 真人特级毛片免费视频 | 国产xxxx做受性欧美88 | 日韩 欧美 中文字幕 不卡 | 欧美成人免费在线观看 | 欧美日韩中文视频 | 西西做人爱免费视频 | 伊人精品视频在线 | 香蕉精品高清在线观看视频 | 日韩免费观看一级毛片看看 | 久久精品一区二区三区资源网 | 青青热久久国产久精品秒播 | 国产成人a毛片 | 四虎影城| 国产精品一二区 | www.四虎影| 青青青国产在线 | 国产看片网站 | 国产真实乱人偷精品 |