python 協程簡介

2021-09-26 10:06:57 字數 1287 閱讀 2669

協程簡介:

字典為動詞「to yield」給出了兩個釋義:產出和讓步。對於python 生成器中的yield來 說,這兩個含義都成立。yield item這行**會產出乙個值,提供給next(...)的呼叫方; 此外,還會作出讓步,暫停執行生成器,讓呼叫方繼續工作,直到需要使用另乙個值時再 呼叫next()。呼叫方會從生成器中拉取值。

從句法上看,協程與生成器類似,都是定義體中包含yield關鍵字的函式。可是,在協程 中,yield通常出現在表示式的右邊(例如,datum = yield),可以產出值,也可以不產 出——如果yield關鍵字後面沒有表示式,那麼生成器產出none。協程可能會從呼叫方接 收資料,不過呼叫方把資料提供給協程使用的是.send(datum)方法,而不是next(...)函 數。通常,呼叫方會把值推送給協程。

yield關鍵字甚至還可以不接收或傳出資料。不管資料如何流動,yield都是一種流程控制 工具,使用它可以實現協作式多工:協程可以把控制器讓步給中心排程程式,從而啟用 其他的協程。

從根本上把yield視作控制流程的方式,這樣就好理解協程了。

生成器如何進化成協程:

協程的底層架構在「pep 342—coroutines via enhanced generators」中定義,並在 python 2.5(2006 年)實現了。自此之後,yield關 鍵字可以在表示式中使用,而且生成器 api 中增加了.send(value)方法。生成器的呼叫方 可以使用.send(...)方法傳送資料,傳送的資料會成為生成器函式中yield表示式的值。 因此,生成器可以作為協程使用。協程是指乙個過程,這個過程與呼叫方協作,產出由調 用方提供的值。

除了.send(...)方法,pep 342 還新增了.throw(...).close()方法:前者的作用是讓 呼叫方丟擲異常,在生成器中處理;後者的作用是終止生成器

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

python 併發程式設計 協程 協程介紹

協程 是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是執行緒 協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的 需要強調的是 1.python的執行緒屬於核心級別的,即由作業系統控制排程 如單執行緒遇到io或執行時間過長就會被迫交出cpu執行許可...