11.python併發入門(part1 初識進程與線程,併發,並行,同步,異步)

1、什麼是進程?
python

在說什麼是進程以前,須要先插入一個進程切換的概念!
多線程

進程,能夠理解爲一個正在運行的程序。
併發

如今考慮一個場景,假若有兩個程序A和B,程序A在執行到一半的過程當中,須要讀取大量的數據輸入(I/O操做),而此時CPU只能靜靜地等待任務A讀取完數據才能繼續執行,這樣就白白浪費了CPU資源。你是否是已經想到在程序A讀取數據的過程當中,讓程序B去執行,當程序A讀取完數據以後,讓程序B暫停。這固然沒問題,但這裏有一個關鍵詞:切換。異步

既然是切換,那麼這就涉及到了狀態的保存,狀態的恢復,加上程序A與程序B所須要的系統資源(內存,硬盤,鍵盤等等)是不同的。天然而然的就須要有一個東西去記錄程序A和程序B分別須要什麼資源,怎樣去識別程序A和程序B等等既然是切換,那麼這就涉及到了狀態的保存,狀態的恢復,加上程序A與程序B所須要的系統資源(內存,硬盤,鍵盤等等)是不同的。天然而然的就須要有一個東西去記錄程序A和程序B分別須要什麼資源,怎樣去識別程序A和程序B等等既然是切換,那麼這就涉及到了狀態的保存,狀態的恢復,加上程序A與程序B所須要的系統資源(內存,硬盤,鍵盤等等)是不同的。天然而然的就須要有一個東西去記錄程序A和程序B分別須要什麼資源,怎樣去識別程序A和程序B等等編輯器


簡單說了進程切換的概念,接下來就來講說進程的定義吧。ide

進程,通常由三部分組成,分別是程序,數據集(這個程序裏的數據),進程控制塊三個部分組成,
性能

咱們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程當中所須要使用的資源;進程控制塊用來記錄進程的外部特徵,描述進程的執行變化過程,系統能夠利用它來控制和管理進程,它是系統感知進程存在的惟一標誌。操作系統

2、什麼是線程?線程

1.多線程的引入進程

假如,一個編輯器程序,須要去接收鍵盤的輸入,還須要把內容輸出到屏幕上,還須要把內容寫到硬盤中,若是隻有單進程的話,就會形成同一時間只能作一件事的狀況,(好比說,在將文本保存到硬盤,尚未保存完以前不能作其餘事情)。

接下來能夠試試開多個線程,爲這個程序的每個功能去開一個線程,進程A去接收用戶鍵盤的輸入,進程B把用戶輸入的內容顯示在屏幕上,進程C負責把文本數據保存到硬盤。

這裏進程A,B,C間的協做涉及到了進程通訊問題,並且有共同都須要擁有的東西,這個東西就是文本的內容!!(這也就是以前提到進程中數據集的概念!)

如果這幾個進程之間要互相協做,必需要把數據資源保存給每一個進程!,有多個進程,原來的數據集就會有多份!


在這就須要引入一個概念,也就是說不一樣進程之間的數據集都是獨立的!默認是沒法共享的!

這幾個進程在不停切換的時候,會形成性能上的損失,這是由於進程和進程之間的數據資源都是獨立的!!


遇到這種狀況,推薦使用多線程。

還拿剛說到的文本編輯器的程序來舉例,假若有一種機制,能夠分別使任務A,任務B,任務C共享一個數據集,這樣,在cpu上下文切換的時候,所須要保存和恢復的內容就會少不少!而且又能夠減小進程之間通訊所帶來的損耗! 這種機制就是多線程!!


咱們能夠把多線程理解爲一個輕量級的多進程。

線程是cpu的最小執行單元,同時也是程序執行的最小單元。


線程是由「線程id」,「程序計數器」,「集合」,「堆棧」 共同組成的。

線程的引入減少了程序併發執行時的開銷,提升了操做系統的併發性能。


不過須要注意的是!!線程並無本身的數據集!!


3、進程和線程之間的關係。

1.線程能夠理解爲是進程的實體。

2.一個進程中至少必須包含一個線程。

3.一個線程只能分配給一個進程,一個進程能夠有多個線程。(咱們也能夠理解爲進程是線程的容器。)

4.cpu在分配資源(數據集)的時候,只能把資源分配給進程!!!

5.真正放在cpu上運行的是線程。


4、並行與併發的概念。

並行處理(Parallel Processing) :並行處理是計算機能夠同時執行多個處理的一種計算方法。

(並行處理的主要目的是節省大型和複雜問題的解決時間)


併發處理(concurrency Processing):指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個CPU上運行,但任一個時刻點上只有一個程序在CPU上運行。


併發的關鍵是你有處理多個任務的能力,不必定要同時。並行的關鍵是你有同時處理多個任務的能力。因此說,並行是併發的子集。



5、同步與異步

同步就是指一個進程在執行某個請求的時候,若該請求須要一段時間才能返回信息,那麼這個進程將會一直等待下去,直到收到返回信息才繼續執行下去;異步是指進程不須要一直等下去,而是繼續執行下面的操做,無論其餘進程的狀態。當有消息返回時系統會通知進程進行處理,這樣能夠提升執行的效率。舉個例子,打電話時就是同步通訊,發短息時就是異步通訊。


6、補充說明。

  1. 什麼狀況下會觸發進程的切換?

    1.1出現I/O操做

    1.2這個進程運行的時間超出了cpu分配給它的時間片。

  2. 進程和線程。

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

    2.2 線程:最小的執行單位。


3.多線程和多進程的應用場景。

對於計算密集型的任務,在python中使用多線程是徹底沒有意義的!!甚至可能會讓程序變得更慢,在python下,對於計算密集型的任務,推薦使用多進程!(這種現象徹底是全局解釋器鎖的特性致使的。)


對於I/O密集型的任務,推薦使用多線程。

相關文章
相關標籤/搜索