1. 程式人生 > >python 進程、線程、協程

python 進程、線程、協程

rep 關系 上下 數據集 接收鍵盤輸入 class 輕量級 還需要 是的

一、進程

程序僅僅只是一堆代碼而已,而進程指的是程序的運行過程。需要強調的是:同一個程序執行兩次,那也是兩個進程。

進程:資源管理單位(容器)。

線程:最小執行單位,管理線程的是進程。

進程定義:

進程就是一個程序在一個數據集上的一次動態執行過程。進程一般由程序、數據集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標誌。

二、線程

線程的出現是為了降低上下文切換的消耗,提高系統的並發性,並突破一個進程只能幹一樣事的缺陷,使到進程內並發成為可

能。假設,一個文本程序,需要接受鍵盤輸入,將內容顯示在屏幕上,還需要保存信息到硬盤中。若只有一個進程,勢必造成同一時間只能幹一樣事的尷尬(當保存時,就不能通過鍵盤輸入內容)。若有多個進程,每個進程負責一個任務,進程A負責接收鍵盤輸入的任務,進程B負責將內容顯示在屏幕上的任務,進程C負責保存內容到硬盤中的任務。這裏進程A,B,C間的協作涉及到了進程通信問題,而且有共同都需要擁有的東西——-文本內容,不停的切換造成性能上的損失。若有一種機制,可以使任務A,B,C共享資源,這樣上下文切換所需要保存和恢復的內容就少了,同時又可以減少通信所帶來的性能損耗,那就好了。是的,這種機制就是線程。線程也叫輕量級進程,它是一個基本的CPU執行單元,也是程序執行過程中的最小單元,由線程ID、程序計數器、寄存器集合
和堆棧共同組成。線程的引入減小了程序並發執行時的開銷,提高了操作系統的並發性能。線程沒有自己的系統資源。

進程與線程的關系

在傳統操作系統中,每個進程有一個地址空間,而且默認就有一個控制線程。

多線程(即多個控制線程)的概念是,在一個進程中存在多個控制線程,控制該進程的地址空間。

進程只是用來把資源集中到一起(進程只是一個資源單位,或者說資源集合),而線程才是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 進程、線程、協程