協程(coroutine),也可以被稱為微執行緒,是一種使用者態內的上下文切換技術。簡而言之,其實就是通過乙個執行緒實現**塊相互切換執行。例如:
def
func1()
:print(1
)...
print(2
)def
func2()
:print(3
)...
print(4
)func1(
)func2(
)
上述**是普通的函式定義和執行,按流程分別執行兩個函式中的**,並先後會輸出:1、2、3、4
。但如果介入協程技術那麼就可以實現函式見**切換執行,最終輸入:1、3、2、4
。
在python中有多種方式可以實現協程,例如:
greentlet是乙個第三方模組,需要提前安裝pip3 install greenlet
才能使用。
from greenlet import greenlet
deffunc1()
:print(1
)# 第1步:輸出 1
gr2.switch(
)# 第3步:切換到 func2 函式
print(2
)# 第6步:輸出 2
gr2.switch(
)def
func2()
:print(3
)# 第4步:輸出 3
gr1.switch(
)print(4
)# 第8步:輸出 4
gr1 = greenlet(func1)
gr2 = greenlet(func2)
gr1.switch(
)# 第1步:去執行 func1 函式
注意:switch中也可以傳遞引數用於在切換執行時相互傳遞值。
基於python的生成器的yield和yield form關鍵字實現協程**。
def
func1()
:yield
1yield
from func2(
)yield
2def
func2()
:yield
3yield
4f1 = func1(
)for item in f1:
print
(item)
注意:yield form關鍵字是在python3.3中引入的。
import asyncio
@asyncio.coroutine
deffunc1()
:print(1
)yield
from asyncio.sleep(2)
# 遇到io耗時操作,自動化切換到tasks中的其他任務
print(2
)@asyncio.coroutine
deffunc2()
:print(3
)yield
from asyncio.sleep(2)
# 遇到io耗時操作,自動化切換到tasks中的其他任務
print(4
)tasks =
[ asyncio.ensure_future( func1())
, asyncio.ensure_future( func2())
]loop = asyncio.get_event_loop(
)loop.run_until_complete(asyncio.wait(tasks)
)
注意:基於asyncio模組實現的協程比之前的要更厲害,因為他的內部還整合了遇到io耗時操作自動切花的功能。
async & awit 關鍵字在python3.5版本中正式引入,基於他編寫的協程**其實就是 上一示例 的加強版,讓**可以更加簡便。
python3.8之後@asyncio.coroutine
裝飾器就會被移除,推薦使用async & awit 關鍵字實現協程**。
import asyncio
async
deffunc1()
:print(1
)await asyncio.sleep(2)
print(2
)async
deffunc2()
:print(3
)await asyncio.sleep(2)
print(4
)tasks =
[ asyncio.ensure_future(func1())
, asyncio.ensure_future(func2())
]loop = asyncio.get_event_loop(
)loop.run_until_complete(asyncio.wait(tasks)
)
關於協程有多種實現方式,目前主流使用是python官方推薦的asyncio模組和async&await關鍵字的方式,例如:在tonado、sanic、fastapi、django3 中均已支援。 非同步程式設計 協程
現在是 python3.5 以後已經進入非同步時代 python由於gil 全域性鎖 的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板.現有的python 非同步框架 python 中的主...
非同步程式設計 協程
現在是 python3.5 以後已經進入非同步時代 python由於gil 全域性鎖 的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板.現有的python 非同步框架 python 中的主...
python協程與非同步協程
在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...