1. 程式人生 > >python第九天(9-34)

python第九天(9-34)

對象 https 圖片 引入 主線程 方法 __name__ play link

技術分享圖片

一:並行,並發概念

  • 並發:指系統具有操作多個任務的能力
  • 並行:指形同具有同時操作多個任務的能力
  • 並行可以看作是並發的子集

二:同步,異步概念

  • 同步:所謂同步,就是發出一個功能調用時,在沒有得到結果之前,該調用就不返回或不繼續執行後續操作-------就是等
  • 個人理解:當程序出現阻塞++++++++++++    的時候,一直等到阻塞結束
  • 異步:當一個異步過程調用發出後,調用者在沒有得到結果之前,就可以繼續執行後續操作
    • 個人理解:當程序處於阻塞的時候,就去執行其他的操作,等到阻塞結束,再回來

技術分享圖片

一:GIL

  • 首先需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念
  • 即全局解釋器所(global interpreter lock),每個線程在執行時候都需要先獲取GIL,保證同一時刻只有一個線程可以執行代碼,即同一時刻只有一個線程使用CPU,也就是說多線程並不是真正意義上的同時執行

二:任務分類

  • IO密集型任務:python的多線程是有意義的
  • 計算密集型任務:不適合python

GIL一篇文章:https://blog.csdn.net/weixin_41594007/article/details/79485847

技術分享圖片

一:同步鎖

  通常被用來實現對共享資源的同步訪問,為每一個共享資源創建一個Lock對象,當你需要訪問該資源時,調用acquire()方法來獲取鎖對象(如果其他線程已經獲得了該鎖,則當前線程需要等待其被釋放),待資源訪問完後,在調用release方式釋放鎖

二:代碼實例解析

技術分享圖片
 1 def minus():
 2     global num
 3     temp=num
 4     #time.sleep(0.005)
 5     num=temp-1
 6 
 7 if __name__=="__main__":
 8     import threading,time
 9     num=100
10     thread=[]
11     for i in range(100):
12         i=threading.Thread(target=minus)
13         thread.append(i)
14         i.start()
15 for t in thread:#讓主線程等待子線程完畢再執行 16 t.join() 17 print(num)
同步鎖例子

解析
1.再沒有time.sleep的時候程序結果為0
2.但在加入time.sleep時會發現隨時間的不一樣,答案也不一樣
    time.sleep(1):99
3.時間一樣,但每次結果也不一樣
     time.sleep(0.001):88 84 89.....

4.猜想:當遇到sleep時,cpu就會切換線程去執行,當sleep時間剛好切換過100此線程之後,又開始執行這100個線程的最後一步,導致結果為100
         當遇到sleep不夠切換100次線程時,第一個線程先開始temp=100,遇到sleep切換到第二個線程,第二個線程temp也為100,但當第二次切換線程時,有可能去到第一個線程去執行第二部,這樣就會出現這種情況

以上為個人理解

python第九天(9-34)