1. 程式人生 > >13 並發編程-(協程)-協程的基本概念

13 並發編程-(協程)-協程的基本概念

io阻塞 span 提升 什麽是 並發執行 consumer 權限 pytho 協程

1、協程 --引子

本節的主題是基於單線程來實現並發,即只用一個主線程(很明顯可利用的cpu只有一個)情況下實現並發,為此我們需要先回顧下並發的本質:切換+保存狀態

cpu正在運行一個任務,會在兩種情況下切走去執行其他的任務(切換由操作系統強制控制),一種情況是該任務發生了阻塞,另外一種情況是該任務計算的時間過長或有一個優先級更高的程序替代了它

進程的三種狀態:

運行、阻塞、就緒

技術分享圖片

ps:在介紹進程理論時,提及進程的三種執行狀態,而線程才是執行單位,所以也可以將上圖理解為線程的三種狀態

技術分享圖片
import time

# 串行執行
def consumer(res):
    
pass def producer(): res = [] for i in range(100000): res.append(i) return res start = time.time() res = producer() consumer(res) stop = time.time() print(stop - start) # 基於 yield並發執行 import time def consumer(): while True: X = yield def producer(): g
= consumer() next(g) for i in range(100000): g.send(i) start = time.time() #基於yield保存狀態,實現兩個任務直接來回切換,即並發的效果 #PS:如果每個任務中都加上打印,那麽明顯地看到兩個任務的打印是你一次我一次,即並發執行的. producer() stop = time.time() print(stop - start)
View Code

二:第一種情況的切換。在任務一遇到io情況下,切到任務二去執行,這樣就可以利用任務一阻塞的時間完成任務二的計算,效率的提升就在於此。

yield並不能實現遇到io切換

技術分享圖片

2、協程的介紹

協程的本質就是在單線程下,由用戶自己控制一個任務遇到io阻塞了就切換另外一個任務去執行,以此來提升效率。

為了實現它,我們需要找尋一種可以同時滿足以下條件的解決方案:

1. 可以控制多個任務之間的切換,切換之前將任務的狀態保存下來,以便重新運行時,可以基於暫停的位置繼續執行。
2. 作為1的補充:可以檢測io操作,在遇到io操作的情況下才發生切換

2.1、協程定義

協程:是單線程下的並發,又稱微線程,纖程。英文名Coroutine。一句話說明什麽是線程:協程是一種用戶態的輕量級線程,即協程是由用戶程序自己控制調度的。、

註意:

1. python的線程屬於內核級別的,即由操作系統控制調度(如單線程遇到io或執行時間過長就會被迫交出cpu執行權限,切換其他線程運行)
2. 單線程內開啟協程,一旦遇到io,就會從應用程序級別(而非操作系統)控制切換,以此來提升效率(!!!非io操作的切換與效率無關)

技術分享圖片

2.2、協程的特點

技術分享圖片

本質單線程串行執行所以不需要加鎖

13 並發編程-(協程)-協程的基本概念