《對廖雪峰老師的Python教程的學習小結六》

2021-09-26 02:08:48 字數 1343 閱讀 7695

下面是第5部分的內容。內容中涉及的程式均**於廖老師的python教程(**為

十五、非同步io

結合之前介紹的io密集型的內容,由於大多數的任務都是io密集型的,所以可以使用非同步io的方式完成多工。

同步io和非同步io的對比:同步io下,當前執行緒被掛起,其它需要cpu執行的**無法被當前執行緒執行;非同步io下,需要乙個

訊息迴圈

,其中主線程不斷地重複「讀取訊息-處理訊息」的過程(遇到io操作時,**只負責傳送io請求,不等待io結果,直接結束本輪訊息處理,進入下一輪訊息處理過程。當io操作完成後,會收到「io完成」的訊息,處理該訊息即可以直接獲取io操作結果)。

1. 協程

子程式是通過棧來實現,乙個執行緒就是執行乙個子程式。在**中,子程式的呼叫順序是確定的。但是,

協程在執行子程式時,不是函式的呼叫,而是類似於cpu的

中斷。

協程是乙個執行緒在執行,而不是多執行緒。優勢在於:沒有執行緒切換的消耗,不需要多執行緒的鎖機制,具有極高的執行效率。

為了充分利用多核和協程,可以採用多程序+協程的方式。

python對於協程的實現是通過generator完成的。其中,python的yield不但可以返回乙個值,還可以接收呼叫者發出的引數。

實現協程的過程:1. 

啟動生成器;

2. 傳送資料;

3. 接收返回的資料;

4. 資料傳送完,關閉執行緒;

2. asyncio

asyncio是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。

實現非同步io:

(1)獲取eventloop; (

2)把需要執行的協程

(用@asyncio.coroutine把乙個generator標記為coroutine型別,非同步操作是通過coroutine中的yield

from完成

)扔到eventloop中執行。

具體的實現**請見廖老師的教程部分。

實現了兩個或多個coroutine的單執行緒併發。

3. async/await

python 3.5之後,引入async、await來使coroutine的**更簡潔易讀。具體實現是如下的兩個替換:

1. 將@asyncio.coroutine替換為async;

2. 將yield from 替換為await。

asyncio可以實現單執行緒的併發io操作。若是僅用在客戶端,則發揮的威力不大;若是用在伺服器端,如web伺服器,由於http連線是io操作,因而可以用單執行緒+coroutine實現多使用者的高併發支援。

asyncio支援tcp、udp等協議,aiohttp是基於asyncio實現http框架。

廖雪峰老師Git教程學習筆記

初始化乙個git倉庫,使用git init命令。新增檔案到git倉庫,分兩步 每次修改,如果不用git add到暫存區,那就不會加入到commit中 使用命令git add,注意,可反覆多次使用,新增多個檔案 將修改的檔案從工作區新增至暫存區 使用命令git commit m,完成。將暫存區的所有內...

廖雪峰python教程 Python簡介

python是著名的 龜叔 guido van rossum在1989年聖誕節期間,為了打發無聊的聖誕節而編寫的乙個程式語言。現在,全世界差不多有600多種程式語言,但流行的程式語言也就那麼20來種。如果你聽說過tiobe排行榜,你就能知道程式語言的大致流行程度。這是最近10年最常用的10種程式語言...

廖雪峰python教程 Python簡介

python是著名的 龜叔 guido van rossum在1989年聖誕節期間,為了打發無聊的聖誕節而編寫的乙個程式語言。現在,全世界差不多有600多種程式語言,但流行的程式語言也就那麼20來種。如果你聽說過tiobe排行榜,你就能知道程式語言的大致流行程度。這是最近10年最常用的10種程式語言...