協成與非同步IO

2021-09-26 15:30:07 字數 1307 閱讀 6883

協程又稱為微執行緒,纖程。英文名coroutine

協程看上去是函式,但執行過程中,在函式內部中斷後,然後轉而執行別的函式,

在適當的時候返回來接著執行。

python可以通過yield/send的方式實現協程,也可以使用第三方庫中的greenlet來

實現協程。

協程的優勢

協程的特點在於是乙個執行緒執行。(本質)

所以協程的最大的優勢就是極高的執行效率。因為子程式切換不是執行緒切換,而是

由程式自身控制,因此 ,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,

協程的效能優勢越明顯。(因為內部封裝了cpu的上下文)

就是不需要多執行緒的鎖的機制,因為只有乙個執行緒,也不存在同時寫

變數的衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行

效率比執行緒高很多。

greenlet

為了更好使用協程來完成多工,python中的greenlet模組對其封裝,從而使得

切換任務變得更加簡單

安裝greenlet模組使用:pip install greenlet

協程的缺陷

無法利用多核資源:協程的本質是單執行緒,他不能同時將cpu的多個核用上,

協程需要和程序配合才能執行在多cpu上。日常編寫的絕大部分沒這個必要,

除非是cpu密集型應用。(gevent)

進行阻塞(blocking)操作(如io時)會阻塞掉整個程式。

同步io操作:導致請求程序阻塞,直到io 操作完成。

非同步io操作:不導致程序阻塞。

gevent

greenlet已經實現了協程,但是這個還得人工切換,是不是覺得太麻煩了,不要

著急,python還有乙個比greenlet更強大的並且能夠自動切換任務的模式gevent

其原理是當乙個greenlet攜帶io操作時(值的是input output 輸入輸出,比如網路

檔案操作等)比如訪問網路,就自動切換到其他的greenlet ,等到io操作完成,在適當的時候切換回來繼續執行。

由於io操作非常耗時,經常使程式處於等待狀態,有了gevent為我們自動切換協程,

就保證總有greenlet在執行,而不是等待io

安裝gevent命令模組:pip install gevent

gevent的基本使用方式

gevent.spawn(func, *args, …)方法用來生成協程,他接受乙個函式作為引數

gevent.joinall([t1, t2, …])方法用來啟動協程輪詢並等待執行結果

gevent.sleep()用來模擬乙個io操作,阻塞後自動切換到另乙個協程執行

非同步I O 協程

什麼是協程呢?協程 coroutines 是一種比執行緒更加輕量級的存在,正如乙個程序可以擁有多個執行緒一樣,乙個執行緒可以擁有多個協程。協程不是被作業系統核心所管理的,而是完全由程式所控制,也就是在使用者態執行。這樣帶來的好處是效能大幅度的提公升,因為不會像執行緒切換那樣消耗資源。協程不是程序也不...

非同步IO 協程回顧yield from

咱先看看yield和yield form 的區別在哪兒,如下,全部傳入range 10 def g1 iterable yield iterable def g2 iterable yield from iterable for value in g1 range 10 print value fo...

同步IO與非同步IO

非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請求後,將會通知執行緒io操作完成了。同步io在同一時刻只允許乙個io操作,也就是...