天天看點

自學python執行個體_總結線程程序協程1.共同的作用2.并發和并行3.什麼是線程?4.什麼是程序?5.什麼是協程?6.三程對比7.總結

1.共同的作用

就是實作多任務,在同一時間,可以同時做多件事情,就比如你在電腦上可以同時上qq,同時聽音樂~

2.并發和并行

雖然說,你可以在電腦上同時上qq和同時聽音樂,看似你電腦正在完成多任務,但是實際上,你的電腦還是按順序的一個一個執行任務的,讓你感覺到多任務是錯覺,因為電腦的運作速度實在是太快啦!

如果說要真正的多任務,一個cup完成一個任務,兩個cup完成兩個任務,多核cpu完成多個任務,好像隻要你的cpu夠多,就可以完成多任務了?

不是的,你可以打開你的任務管理器,看看你電腦的背景有多個程序在運作吧!現在的電腦大多都是雙核或者四核的吧,至少我家電腦現在還是雙核T.T,是以,下面就要引出并發和并行的概念了!

  • 并發:指的是任務數多餘cpu核數,通過作業系統的各種任務排程算法,實作用多個任務“一起”執行(實際上總有一些任務不在執行,因為切換任務的速度相當快,看上去一起執行而已)
  • 并行:指的是任務數小于等于cpu核數,即任務真的是一起執行的.

是以多,基本上都是處于并發狀态下的運作方式.

3.什麼是線程?

為了實作線程,我們可以使用threading子產品(使用方法也簡單,這裡我就不說了),需要注意的是,線程的全局變量共享的,我們可以了解成一條生産線,a負責放東西,b負責裝東西等等...總的東西是共享的,但是你們都同時在做一件事情!.

線程中,有一個加 互斥鎖 的概念,就是多個線程,都同時需要對一個全局變量進行修改的時候,如果沒有先後順序的話,不同的作業系統可能就會有不同的結果,所有就有了互斥鎖.

# 建立鎖
mutex = threading.Lock()
# 鎖定
mutex.acquire()
# 釋放
mutex.release()
           

即a負責放東西,b負責裝東西,加了鎖之後,必須等a完成之後,b才能繼續裝東西,後面以此類推,這樣就保證了一整個過程不會混亂了.

但是這樣,就會産生一個新的東西,叫死鎖,就是線上程間共享多個資源的時候,如果兩個線程分别占有一部分資源并且同時等待對方的資源,就會造成死鎖。即,你在等他先,他在等你先,你們就僵住了.

4.什麼是程序?

程序,大家看到都見過,當我們一個程式未響應卡住的時候,我們就會打開任務管理器,然後結束這個程序,那麼程序到底是什麼呢?

程序:一個程式運作起來後,代碼+用到的資源 稱之為程序,它是作業系統配置設定資源的基本單元。是以不僅可以通過線程完成多任務,程序也是可以的.

程序的建立可以使用multiprocessing,使用起來也比較簡單,我們需要知道的是,程序的多任務建立,相當于,複制了一個完全一模一樣占了相同資源的程式,一起運作,并且他們是不共享全局變量的,如果需要傳遞變量,可以使用queue方法進行傳遞.

我們可以了解成,一個工廠為提高效率,他又多開了一個工廠,但是要消耗他更多的資源.

5.什麼是協程?

協程是python個中另外一種實作多任務的方式,隻不過比線程更小占用更小執行單元(了解為需要的資源).為啥說它是一個執行單元,因為它自帶CPU上下文.這樣隻要在合适的時機,我們可以把一個協程切換到另一個協程. 隻要這個過程中儲存或恢複 CPU上下文那麼程式還是可以運作的.

即就是它臨時儲存了目前函數的一些資訊,然後去執行另一個函數,等有時間了回頭再來進行這個函數,隻要切換的夠快,那麼就是多任務了.

在實作多任務時, 線程切換從系統層面遠不止儲存和恢複 CPU上下文這麼簡單.作業系統為了程式運作的高效性每個線程都有自己緩存Cache等等資料,作業系統還會幫你做這些資料的恢複操作.是以線程的切換非常耗性能.但是協程的切換隻是單純的操作CPU的上下文,是以一秒鐘切換個上百萬次系統都抗的住.

實作協程的方法有很多,可以通過yield,greenlet,gevent.

6.三程對比

有一個列子,講得非常的好:

有一個老闆想要開個工廠進行生産某件商品(例如剪子)

他需要花一些财力物力制作一條生産線,這個生産線上有很多的器件以及材料這些所有的 為了能夠生産剪子而準備的資源稱之為:程序

隻有生産線是不能夠進行生産的,是以老闆的找個勞工來進行生産,這個勞工能夠利用這些材料最終一步步的将剪子做出來,這個來做事情的勞工稱之為:線程

這個老闆為了提高生産率,想到3種辦法:

  1. 在這條生産線上多招些勞工,一起來做剪子,這樣效率是成倍増長,即單程序 多線程方式
  2. 老闆發現這條生産線上的勞工不是越多越好,因為一條生産線的資源以及材料畢竟有限,是以老闆又花了些财力物力購置了另外一條生産線,然後再招些勞工這樣效率又再一步提高了,即多程序 多線程方式
  3. 老闆發現,現在已經有了很多條生産線,并且每條生産線上已經有很多勞工了(即程式是多程序的,每個程序中又有多個線程),為了再次提高效率,老闆想了個損招,規定:如果某個員工在上班時臨時沒事或者再等待某些條件(比如等待另一個勞工生産完謀道工序 之後他才能再次工作) ,那麼這個員工就利用這個時間去做其它的事情,那麼也就是說:如果一個線程等待某些條件,可以充分利用這個時間去做其它事情,其實這就是:協程方式

7.總結

  1. 線程就是每一個勞工,作業系統配置設定的機關
  2. 程序是作業系統資源配置設定的機關
  3. 協程,就是線上程裡面,把空餘的時間利用起來
  4. 線程和程序可能是并行,但是協程一定是并發的
  5. 程序消耗資源最大,效率最低.線程消耗資源一般,效率一般,協程消耗資源最低,效率最高
  6. 程序适合做多任務大型的運算,線程協程适合做多件小事情
  7. 線程依賴于程序,協程依賴于線程