python淺學筆記20 非同步IO

2021-09-24 01:17:05 字數 2449 閱讀 5628

cpu速度遠遠快於 網路 磁碟 io

在乙個執行緒裡,io會阻塞其它**的執行。為了不阻塞,就要用多執行緒或多程序,雖然併發可以解決這個問題,但是系統不能無上限的增加執行緒,系統切換執行緒的開銷也很大

另一種解決問題的方法非同步io,cpu負責**的執行,io操作由io裝置執行,**負責開啟乙個io操作,並監聽io的進度。

非同步模型需要乙個訊息迴圈,主線程不斷地重複『讀取訊息-處理訊息』這一過程。

訊息模型早就應用在桌面應用程式中了,乙個gui程式的主線程就負責不停的讀取訊息並處理訊息。所有的鍵盤、滑鼠等訊息都被傳送到gui程式的訊息佇列中。

gui執行緒處理訊息必須非常迅速,如果出問題,處理時間過長,會讓人感到卡頓,程式看上去停止響應。

同步io,主線程遇到io操作,就會掛起,非同步io,主線程遇到io操作,會發乙個io請求,在輪詢訊息時,如果io操作完成,會在訊息佇列中有其完成的訊息,這是才會處理io完成階段的**。

非同步io模型 能大大提公升io密集型應用程式的多工處理能力。

非同步io到底怎麼實現的呢?像遊戲引擎,就是每一幀處理很多東西,其中就有網路操作。

又名:微執行緒 纖程,在lua廣泛使用。

乙個函式執行,可以中斷,然後執行其他函式(並不是函式呼叫),還可以返回繼續執行(不是其他函式返回)

比多執行緒的優勢:1.切換沒有執行緒那麼大的開銷,2.不需要鎖機制,不存在同時寫變數的問題

多程序 + 協程,可以充分利用多核,

python的協程是由generator實現的。

不僅可以用for迭代,還可以用next()獲取yield返回的下乙個值。

生產者-消費者模型

generator.send(none)可以啟動生成器且generator用send傳送協程的繼續開始,並返回下乙個yield值

close()可以關閉乙個協程。

python3.4版本內建了對非同步io的支援。

asyncio的程式設計模型就是乙個訊息迴圈。eventloop,把需要執行的協程放到這個loop中執行,就實現了非同步io。多個協程可以併發執行。

python3.5 引入了新語法async 和 await,可以讓coroutine**更簡潔易讀。

只需要把3.4的 @asyncio.coroutine 替換為 async,並從註解位置換成修飾def,把yield from替換為await

asyncio 實現了tcp\udp\ssl等協議

aiohttp則是基於asyncio實現的http框架

)run_until_complete方法:run the event loop until a future is done.

run_forever方法:run the event loop until stop() is called.

)都不用引入asyncio,是不是清爽了很多

我更喜歡使用另一種註解的方式。

python淺學筆記2 函式

漢諾塔 時間戳 2019年3月6日23 38 55 常用函式呼叫 abs max float str bool hex isinstance x,int,str 定義乙個函式 使用關鍵字 def 例如 def my abs x if x return x else return x如果沒有retur...

python淺學筆記9 IO程式設計

stringio和bytesio 操作檔案和目錄 序列化 pickling name input output face 磁碟,網路 model stream 流 from to 記憶體 time stop?同步 非同步 由於非同步io比較複雜,本章都是同步io,非同步io在後邊網路伺服器提及。開啟...

python淺學筆記12 常用內建模組

xmlhtmlparser 自稱足夠多,不需額外安裝其他模組。batteries included 獲取本地當前日期和時間 構造時間 timestamp 浮點數 0 1970.01.01 00 00 00 epoch time utc 時區時刻 timestamp 當前時刻 epoch time 的...