1. 程式人生 > >Python併發程式設計之常用概念剖析

Python併發程式設計之常用概念剖析

1 引言

  併發、並行、序列、同步、非同步、阻塞、非阻塞、程序、執行緒、協程是併發程式設計中的常見概念,相似卻也有卻不盡相同,令人頭痛,這一篇博文中我們來區分一下這些概念。

2 併發與並行

  在解釋併發與並行之前,我們必須先明確:單個處理器(一個單核CPU)在某一個時刻只能處理一個執行緒
  併發是指在同一個處理器上通過時間片輪轉的方式在多個執行緒之間頻繁切換,由於切換速度極快,所以看似多個執行緒似乎被同時執行,但實際上每一個時刻都只有一個執行緒被執行,其他的執行緒出於阻塞狀態。
  並行是指多個處理器在同一時刻同時處理了多個不同的執行緒,這才是真正意義的同時被執行。
  如下圖所示,執行緒A與執行緒B同在一個CPU內執行,且任一t時刻內,都只有一個執行緒(A或者B)被執行,所以執行緒A與執行緒B是併發執行的。執行緒C和執行緒D分別在兩個CPU內執行,且在某一個t時刻內同時都在執行,所以執行緒C和執行緒D是並行的。

3 並行與序列

  上面已經說到,並行是指多個任務同時執行,而序列是指多個任務時,各個任務按順序執行,完成一個之後才能進行下一個。
  所以,併發與並行是在某一時刻是否都在執行的區別。並行與序列是同時進行或一個結束才進行下一個的區別。

4 同步與非同步

  同步與非同步的概念與訊息的通知機制有關:
  同步是指執行緒在訪問某一資源時,獲得了資源的返回結果之後才會執行其他操作,否則主動繼續獲取這一資源;
  非同步與同步相對,是指執行緒在訪問某一資源時,無論是否取得返回結果,都進行下一步操作;當有了資源返回結果時,系統自會通知執行緒。

用一個比喻來說明:10多前的銀行是沒有業務取號的,我們去辦理業務時,如果有很多人,那就先排隊,然後關注著什麼時候輪到自己,這就是同步;現在去銀行,得先取一張小紙條,上面寫著你的
業務號,輪到你的時候,銀行會喊你,這就是非同步。非同步機制往往註冊一個回撥機制,在所等待的事件被觸發時由觸發機制(銀行櫃檯業務員)通過某種機制(業務辦理號碼)找到等待該事件的人。

5 阻塞與非阻塞

  阻塞是與非阻塞都是程式的一種執行狀態。
  執行緒在等待某個操作完成期間,自身無法繼續執行別的操作,則稱該執行緒在該操作上是阻塞的。
  執行緒在等待某個操作完成期間,自身可執行別的操作,則稱該執行緒在該操作上是非阻塞的。

繼續上面銀行辦理業務的例子,無論是10多年前的排隊辦理業務,還是現在的業務號辦理業務,如果在我們在等待過程中,什麼也不能做,那就是阻塞的;如果在等待過程中,可以做其他事情(看書
、玩手遊),那就是非阻塞的。

  同步和非同步是個執行緒處理方式或手段,阻塞和非阻塞是執行緒的一種狀態,兩者並不相同也並不衝突。

  同步、非同步與阻塞非阻塞可以產生不同的組合:同步阻塞、同步非阻塞、非同步阻塞、非同步非阻塞。

還是銀行辦理業務的例子:如果排著隊,且只能傻傻的排著隊,看著什麼時候到自己,那就是同步阻塞;如果排著隊還能玩玩手機,偶爾擡頭看看什麼時候到自己,那就是同步非阻塞。如果是現在的
取票按業務號辦理業務,拿到號碼後就陷入懵逼狀態,啥也不能做,直到銀行根據業務號通知自己,那就是非同步阻塞;如果拿到業務號之後,自己愛幹嘛幹嘛,那就是非同步非阻塞。

6 程序 執行緒 協程

6.1 基本概念

  程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位,是資源(記憶體)分配的最小單位。每個程序都有自己的獨立記憶體空間,不同程序通過程序間通訊來通訊。由於程序比較重量,佔據獨立的記憶體,所以上下文程序間的切換開銷(棧、暫存器、虛擬記憶體、檔案控制代碼等)比較大,但相對比較穩定安全。
  執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源。執行緒間通訊主要通過共享記憶體,上下文切換很快,資源開銷較少,但相比程序不夠穩定容易丟失資料。
  協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧,直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數,所以上下文的切換非常快。

6.2 程序與執行緒

  執行緒是指程序內的一個執行單元,也是程序內的可排程實體。執行緒與程序的區別:
  1) 地址空間:執行緒是程序內的一個執行單元,程序內至少有一個執行緒,它們共享程序的地址空間,而程序有自己獨立的地址空間;
  2) 資源擁有:程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源;
  3) 執行緒是處理器排程的基本單位,但程序不是;
  4) 二者均可併發執行
  5) 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口,但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

6.3 協程多與執行緒進行比較

  1) 一個執行緒可以多個協程,一個程序也可以單獨擁有多個協程,這樣python中則能使用多核CPU。
  2) 執行緒程序都是同步機制,而協程則是非同步
  3) 協程能保留上一次呼叫時的狀態,每次過程重入時,就相當於進入上一次呼叫的狀態。

  參考資料:
  https://www.cnblogs.com/lxmhhy/p/6041001.html
  https://www.jianshu.com/p/3308311fb90c

鄭州人工授精醫院

鄭州包皮手術多少錢

鄭州不孕不育醫院哪家好

鄭州男科哪家好