48_并發編程-線程-資源共享/鎖

一、數據共享
  多個線程內部有自己的數據棧,數據不共享;全局變量在多個線程之間是共享的。
 1 # 線程數據共享不安全加鎖
 2 
 3 import time
 4 from threading import Thread, Lock
 5 
 6 
 7 num = 100
 8 
 9 def func(t_lock):
10     global num
11     t_lock.acquire()
12     mid = num
13     mid -= 1
14     time.sleep(0.01) # 設置一個時間,模擬數據修改時,先從內存中拿出作修改,在把結果放回去的時間差
15     num = mid
16     t_lock.release()
17 
18 if __name__ == '__main__':
19 
20     t_lock = Lock()
21 
22     t_lst = []
23     for i in range(10):
24         t_thread = Thread(target=func, args=(t_lock,))    
25         t_lst.append(t_thread)
26         t_thread.start()
27     [t_obj.join() for t_obj in t_lst]    #必須加join,因為主線程和子線程不一定誰快,一般都是主線程快一些,所有我們要等子線程執行完畢才能看出效果    
28 
29     print('主線程結束!', num)    # 結果為90
數據共享實例
二、同步鎖(互斥鎖) -?產生死鎖
  進程也有死鎖與遞歸鎖,在進程那里忘記說了,放到這里一切說了額,進程的死鎖和線程的是一樣的,而且一般情況下進程之間是數據不共享的,不需要加鎖,由于線程是對全局的數據共享的,所以對于全局的數據進行操作的時候,要加鎖。
  死鎖: 是指兩個或兩個以上的進程或線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程,如下就是死鎖
 1 from threading import Thread,Lock
 2 import time
 3 
 4 class MyThread(Thread):
 5     def run(self):
 6         self.func1()
 7         self.func2()
 8     def func1(self):
 9         mutexA.acquire()
10         print('\033[41m%s 拿到A鎖>>>\033[0m' %self.name)
11         mutexB.acquire()
12         print('\033[42m%s 拿到B鎖>>>\033[0m' %self.name)
13         mutexB.release()
14         mutexA.release()
15 
16     def func2(self):
17         mutexB.acquire()  
18         print('\033[43m%s 拿到B鎖???\033[0m' %self.name)
19         time.sleep(2)
20 #分析:當線程1執行完func1,然后執行到這里的時候,拿到了B鎖,線程2執行func1的時候拿到了A鎖,那么線程2還要繼續執行func1里面的代碼,再去拿B鎖的時候,發現B鎖被人拿了,那么就一直等著別人把B鎖釋放,那么就一直等著,等到線程1的sleep時間用完之后,線程1繼續執行func2,需要拿A鎖了,但是A鎖被線程2拿著呢,還沒有釋放,因為他在等著B鎖被釋放,那么這倆人就尷尬了,你拿著我的老A,我拿著你的B,這就尷尬了,倆人就停在了原地
21         
22         mutexA.acquire()
23         print('\033[44m%s 拿到A鎖???\033[0m' %self.name)
24         mutexA.release()
25         mutexB.release()
26 
27 if __name__ == '__main__':
28 
29     mutexA=Lock()    # 同步鎖必須這樣創建
30     mutexB=Lock()
31     for i in range(10):
32         t=MyThread()
33         t.start()
34 
35 '''
36 Thread-1 拿到A鎖>>>
37 Thread-1 拿到B鎖>>>
38 Thread-1 拿到B鎖???
39 Thread-2 拿到A鎖>>>
40 然后就卡住,死鎖了
41 '''
死鎖現象

三、解決死鎖方案 -?遞歸鎖
  解決方法,遞歸鎖,在Python中為了支持在同一線程中多次請求同一資源,python提供了可重入鎖RLock。
  這個RLock內部維護著一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖:
 1 import time
 2 from threading import Thread,RLock
 3 
 4 
 5 class MyThread(Thread):
 6 
 7     def __init__(self, lockA, lockB):
 8         super().__init__()
 9         self.lockA = lockA
10         self.lockB = lockB
11     def run(self):
12         self.func1()
13         self.func2()
14 
15     def func1(self):
16         self.lockA.acquire()
17         print('我是func1')
18         self.lockB.acquire()
19         print('func1中有其他事')
20         self.lockB.release()
21         self.lockA.release()
22 
23     def func2(self):
24         self.lockB.acquire()
25         print('我是func2')
26         time.sleep(0.5)
27         self.lockA.acquire()
28         print('func2中有什么事')
29         self.lockA.release()
30         self.lockB.release()
31 
32 if __name__ == '__main__':
33 
34     lockA = lockB = RLock()
35 
36     t1 = MyThread(lockA, lockB)
37     t1.start()
38     t2 = MyThread(lockA, lockB)
39     t2.start()
40     print('嗯嗯,兩人不錯')
遞歸鎖

轉載于:https://www.cnblogs.com/hq82/p/9858375.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

移動硬盤提示無法訪問設備硬件出現致命錯誤,導致請求失敗的資料尋回方案

J盤打不開設備硬件出現致命錯誤,導致請求失敗,是因為這個I盤的文件系統內部結構損壞導致的。要恢復里面的數據就必須要注意,這個盤不能格式化,否則數據會進一步損壞。具體的恢復方法看正文 工具/軟件:星空數據恢復軟件 步驟1&…

VMware10上新建虛擬機步驟圖解

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 第一種 : 自定義方式: 安裝虛擬機的過程步驟,基本上過程的每一步都有截圖,跟著過程就可以很容易的創…

怎么理解 IaaS、SaaS 和 PaaS 的區別?

原文鏈接:怎么理解 IaaS、SaaS 和 PaaS 的區別? 一、定義層面的區別 SaaS、PaaS、IaaS簡單的說都屬于云計算服務,也就是云計算服務。我們對于云計算的概念,維基百科有以下定義: Cloud computing is a new form of In…

三星“打法”:先模仿對手 再吃掉對手

臺灣地區電子業者將三星視為“臺灣公敵”,事實上,它幾乎是全球電子業者的敵人。 這家韓國電子業巨頭十年之間奪取了日本企業在這一領域中縱橫30年的榮光,更是建立起了令人嘆為觀止的垂直整合帝國。 韓國政府的大力支持、日元升值韓元貶值等均…

SharpZipLib 壓縮ZIP導出

1      var uploadSectionDir Path.Combine("Upload", "QQ", DateTime.Now.ToString("yyyyMMdd"));2 string uploadDir Path.Combine(HttpRuntime.AppDomainAppPath, uploadSectionDir);3 if (!Directory.Exi…

java動態調用c++庫

前言 最近在做一個通過java程序調用c動態語言庫,在網上百度,谷歌找了諸多例子,還是屢試不爽。經過一番折騰還是披荊斬棘,創出一條道路。希望分享給正在迷茫的朋友們... 使用的環境 spring boot gradle JNI介紹 JNI全拼是Java Nat…

如何刪除虛擬機上的操作系統、刪除新建的虛擬機

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 打開VMware,我安裝了三個虛擬系統,要對win98進行刪除,從磁盤上刪除~~ 2、雙擊你要刪除的系統&#xf…

什么是QoS技術

QoS(Quality of Service)是服務質量的簡稱。從傳統意義上來講,無非就是傳輸的帶寬、傳送的時延、數據的丟包率等,而提高服務質量無非也就是保證傳輸的帶寬,降低傳送的時延,降低數據的丟包率以及時延抖動等。…

一套完整的用戶增長系統架構

互聯網的世界里一切都是為了增長,靈光一現的創新可能會讓一個產品成功,但絕不可能長久。 在用戶增長的領域里,如何復用一套框架,找到最佳實踐的一條路徑,再配備一點運氣,去實現商業成功是我一直所探索的話題…

編譯性語言、解釋性語言和腳本語言

什么是編譯性語言、解釋性語言和腳本語言 計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能值型高級語言編寫的程序。  翻譯的方式有兩種,一個是編譯,一個是解釋。…

對多租戶的理解

一、 多租戶定義 多租戶定義: 多租戶技術或稱多重租賃技術,簡稱SaaS,是一種軟件架構技術,是實現如何在多用戶環境下(此處的多用戶一般是面向企業用戶)共用相同的系統或程序組件,并且可確保各用…

查看VMware上虛擬機的 ip 地址

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 開啟虛擬機: 2.輸入賬號密碼登陸到虛擬機中 3. 選擇 xxx Home 右鍵---- Open in Terinal 進入命令行頁面 ----- 輸入命令…

Hibernate之表間關系

ManyToOne 多對一,是最常見的表間關系,對應關系數據庫中的外鍵關系。通常用于建立子實體和其父實體的關聯關系 Entity(name "Person") public static class Person {IdGeneratedValueprivate Long id;//Getters and setters are omitted for …

Python大神告訴你,學習Python應該讀哪些書!

關注頭條號,私信回復資料會有意外驚喜呦………………最后一張照片有資料呦。在傳統的Web開發之外的領域,Python開發人員的就業機會越來越多,無論你是初學者還是大神,現在正是投入到Python學習的好時機。一個IBM的博客文章報道了如…

腳本語言

腳本語言(Script language,scripting language,scripting programming language)是為了縮短傳統的編寫-編譯-鏈接-運行(edit-compile-link-run)過程而創建的計算機編程語言。此命名起源于一個腳本“screenp…

Java Agent

一、什么是 Java Agent ? 籠統地來講,Java Agent 是一個統稱,該功能是 Java 虛擬機提供的一整套后門。通過這套后門可以對虛擬機方方面面進行監控與分析。甚至干預虛擬機的運行。 Java Agent 又叫做 Java 探針,Java Agent 是在 …

JDK 1.8 官網下載地址(linux / windows)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 JDK 1.8 官網下載地址: JDK 1.8 官網下載地址(linuxwindows) 上面連接可以直接點擊,連接…

跟著太白老師學python day11 可迭代對象和迭代器

如果對象的屬性中有__iter__屬性就說明是可迭代的,容器類的數據類型都是可迭代對象 如果對象的屬性中既有__iter__屬性也有__next__屬性,就說明這個對象是迭代器 如何判斷一個函數是不是可迭代的,是不是迭代器 方法一 s 123 print(__iter__ …

攪局者奇虎360:特供機背后的周式隱憂

摘要:從未涉足制造,將來也“絕不參與制造”的360,卻聲稱要進軍智能手機。從未涉足制造,將來也“絕不參與制造”的360,卻聲稱要進軍智能手機。 5月4日晚間,“長達半年的思考”后,奇虎360董事長周…

數據結構基礎入門知識

數據結構基礎入門知識 ------ 數據結構:理解和練習《異類-不一樣的成功啟示錄》IP/26 192IP/25 128IP/24192.12864 3216 2 1 NTP:時間同步服務器高手都是最仔細的,嚴謹的 telnet 查看某個端口是否可用,是否是開啟狀態的要有探索冒險的精神 --…