21 - 協程

返回主頁

📄目錄

1 協程(Coroutine)介紹

介紹:單線程下的開發,又稱微線程、纖程。

⚠️注意:線程和進程的操作由程序觸發系統接口,最後的執行者是系統;協程的操作則是程序員

另一種實現多任務的方式,但比線程更小、佔用更少執行單元(理解為需要的資源)。協程自帶CPU上下文。這樣只要在合適的時機,我們可以把一個協程切換到另一個協程。只要這個過程中保存或恢復CPU上下文,那麼程序還是可以運行的。

1.1 簡單實現協程

python-logo

不是嚴格意義上的協程

輸出結果:

1.1.1 真正的協程樣式

python-logo

輸出結果:

1.2 應用場景

  1. 如果一個線程裡面IO操作比較多的時候,可以用協程 Input/ Output 常見的IO操作:文件操作、網絡請求

  2. 適合高併發處理

2 greenlet:一個由C語言實現的協程模塊

2.1 安裝greenlet

本Project有python版本,即.venv版本。應在其中安裝。

在Python右上角的搜索中,搜索Python Interpreter。

2.2 ⚠️注意:greenlet屬於手動切換,當遇到IO操作,程序會阻塞,而不能進行自動切換

2.3 通過greenlet實現任務的切換

python-logo

輸出結果:

python-logo

👉🏻 以下是官方協程

輸出結果:

3 gevent:遇到IO操作時,會進行自動切換,屬於主動式切換

⚠️注意:文件命名不要和第三方模塊或內置模塊重名

python-logo

3.1 基本方法

  1. gevent.spawn(函數名):創建協程對象

  2. gevent.sleep():耗時操作

  3. gevent.join():阻塞,等待某個協程執行結束

  4. gevent.joinall():等待所有協程對象都執行結束再退出,參數是一個協程對象列表

3.2 gevent自帶耗時操作

python-logo

輸出結果:

3.3 joinall()

joinall():等待所有協程都執行結束再退出

python-logo

輸出結果:

3.4 monkey補丁:擁有在模塊運行時替換的功能

python-logo

輸出結果:

4 總結(線程、進程、協程)

  1. 線程是CPU調度的基本單位,進程是資源分配的基本單位

  2. 進程、線程、協程對比:

    1. 進程:切換需要的資源最大,效率最低

    2. 線程:切換需要的資源一般,效率一般

    3. 協程:切換需要的資源最少,效率高

  3. 多線程適合IO密集型操作(如文件讀寫、爬蟲),多進程適合CPU密集型操作(科學計算、對影片進行高清解碼、計算圓周率等)

  4. 進程、線程、協程都可以完成多任務,可根據自己開發的需要選擇使用

導航連結:

目的地超連結
首頁返回主頁
Python學習Python學習
上一篇20 - 進程
下一篇22 - 正則基礎