協程是一種使用者態的輕量級執行緒,本質上是單執行緒
協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。
使用greenlet實現協程操作,greenlet需要手動進行切換
首先需要使用greenlet建立類似與堆疊空間,然後使用switch進行切換
使用gevent實現協程,無需手動切換,遇到io操作就會進行切換
import gevent
def func1(num):
print('in func1',num)
gevent.sleep(1) #模仿io操作
print('back func1')
def func2():
print('in func2')
gevent.sleep(2) #模仿io操作
print('back func2')
def func3():
print('in func3')
gevent.sleep(3)
print('back func3')
gevent.joinall([
gevent.spawn(func1,1), #傳參的方式
先執行func1,列印第一句後遇到io操作切換到func3又遇到io,再次切換到func2,遇到io操作後由於沒有可執行的函式,開始等待,func1最先可執行自動跳轉到func1列印第二句,然後func2io操作結束輸出func2的第二句,最後func3才結束io操作,所有func3的第二句最後列印
事件驅動模式:每次有乙個事件發生的時候會首先存入到乙個訊息佇列中,然後會有專門的函式迴圈不斷的從佇列中取出事件進行處理,執行完乙個事件後一般會執行乙個**函式來告知當前事件處理完畢。
非同步操作也算是一種事件驅動的模式,遇到io操作的時候交個作業系統來執行,io操作結束後會執行乙個**函式告知程式io結束可繼續執行
Python基礎 34 協程
概述 協程,又稱微執行緒,也稱為使用者級執行緒,在不開闢執行緒的基礎上完成多工,也就是在單執行緒的情況下完成多工,多個任務按照一定順序交替執行,通俗理解只要在def裡面只看到乙個yield關鍵字,就表示它是協程 簡單理解 協程是實現多工的一種方式 1 無需執行緒上下文切換的開銷,協程避免了無意義的排...
python基礎 協程詳解
python的yield不但可以返回乙個值,它還可以接收呼叫者發出的引數。來看例子 傳統的生產者 消費者模型是乙個執行緒寫訊息,乙個執行緒取訊息,通過鎖機制控制佇列和等待,但一不小心就可能死鎖。如果改用協程,生產者生產訊息後,直接通過yield跳轉到消費者開始執行,待消費者執行完畢後,切換回生產者繼...
Python基礎 協程(一)
究竟什麼是協程?1.涉及到同步鎖。2.涉及到執行緒阻塞狀態和可執行狀態之間的切換。3.涉及到執行緒上下文的切換。以上涉及到的任何一點,都是非常耗費效能的操作。next 函式用來建立乙個協程嗷 yield會暫停,當send 的時候才會繼續 python中使用async await來使用協程 impor...