python第九天(9-34)
阿新 • • 發佈:2019-02-05
對象 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)