多線程,多進程使用場景
阿新 • • 發佈:2017-12-19
讀取 如果 有一個 自己 ext 執行 指令 同時 進行
既然有GIL鎖,為什麽還使用多線程?
CPU運行程序的時候,從內存中讀取數據塊,但是內存不支持斷電保存的功能。一旦斷電,數據就會丟失。所以需要把數據存到物理磁盤中,所以CPU運行程序的時候需要先從磁盤中讀出來,放到內存中,CPU才能取到數據。磁盤的讀取比較慢,CPU在物理磁盤中取數據時,需要等待磁盤準備數據,什麽時候數據準備好了,CPU才能使用數據,這樣造成了資源的浪費,寫數據是一樣的,當CPU往磁盤寫入數據的時候就會等待,等數據存入到磁盤中了CPU才能執行別的程序。造成了CPU空閑阻塞狀態,如果有大量的IO操作,就會頻繁出現阻塞行為,那麽GIL鎖就會自動被釋放,這樣就會保證多線程同時運行的效果,雖然不是全部的。一跳主線運行的時候,大概運行了100條指令的時候就會釋放GIL鎖,或者出現阻塞的時候就會釋放GIL鎖。
多線程的應用場景:
CPU密集型的程序,整個程序運行中過程中不需要等待任何的IO操作,只有大量的CPU進行運算,這種線程不合適,進程實現更加合適,因為每個進程中都有一個線程,獨享一個GIL鎖,這樣就不涉及搶的問題了,各自運行各自的程序。所以進程實現更加合適、
協程的使用場景:
協程內部是線程內容劃分的更小的單位,協程跟操作系統沒有關系,只是程序員自己劃分出來的,類似於一個線程中的一跳主線中的兩個函數交替運行,達到同時運行的效果,用yield關鍵字可以讓函數暫停下來,next()函數可以讓程序繼續運行,互相配合達到了協程的效果,上下文切換快速,不需要競爭資源,一條主線。
多線程,多進程使用場景