python 進程、線程、協程
一、進程
程序僅僅只是一堆代碼而已,而進程指的是程序的運行過程。需要強調的是:同一個程序執行兩次,那也是兩個進程。
進程:資源管理單位(容器)。
線程:最小執行單位,管理線程的是進程。
進程定義:
進程就是一個程序在一個數據集上的一次動態執行過程。進程一般由程序、數據集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標誌。
二、線程
線程的出現是為了降低上下文切換的消耗,提高系統的並發性,並突破一個進程只能幹一樣事的缺陷,使到進程內並發成為可
進程與線程的關系
在傳統操作系統中,每個進程有一個地址空間,而且默認就有一個控制線程。
多線程(即多個控制線程)的概念是,在一個進程中存在多個控制線程,控制該進程的地址空間。
進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是cpu上的執行單位。
三、協程
協程是單個線程執行的。 優勢:
1)由於不用線程之間的切換(線程數多時候消耗大),所以與多線程比起來,協程的執行效率非常高。
2) 不需要線程鎖。
要利用多核CPU,一般用多進程+協程。 ( 所以看來多線程還是用的比較少的)
四、GIL(全局解釋器鎖)
GIL加在cpython解釋器中, 其他的python解釋器不會有GIL。
Python中的線程是操作系統的原生線程,Python虛擬機使用一個全局解釋器鎖(Global Interpreter Lock)來互斥線程對Python
虛擬機的使用。為了支持多線程機制,一個基本的要求就是需要實現不同線程對共享資源訪問的互斥,所以引入了GIL。
GIL:在一個線程擁有了解釋器的訪問權之後,其他的所有線程都必須等待它釋放解釋器的訪問權,即使這些線程的下一條指令並不
會互相影響。
在調用任何Python C API之前,要先獲得GIL
GIL缺點:多處理器退化為單處理器;優點:避免大量的加鎖解鎖操作
無論你啟多少個線程,你有多少個cpu, Python在執行一個進程的時候會淡定的在同一時刻只允許一個線程運行。所以,python是無法利用多核CPU實現多線程的。這樣,python對於計算密集型的任務開多線程的效率甚至不如串行(沒有大量切換),但是,對於IO密集型的任務效率還是有顯著提升的。
python 進程、線程、協程