詳解協程,事件驅動模型,I O模型

2021-10-03 20:33:26 字數 1740 閱讀 9554

什麼是事件驅動模型

協程介紹

協程是什麼

協程是微執行緒,他是一種使用者態的輕量級執行緒,它的好處是沒有執行緒切換的開銷,我們開多執行緒,執行緒的上下文切換是耗費cpu的開銷的,但是多協程裡邊,只是乙個控制流調到了另外乙個控制流,它還是單執行緒,所以協程很適合高併發,乙個cpu可以支援上萬的協程,因為都是在乙個執行緒裡,所以很適合進行高併發處理,nginx為什麼能支援高併發,就是因為nginx它預設是單執行緒,乙個執行緒裡面支援上萬個併發,協程實現了單執行緒實現併發的效果?

這種效果實現的?

答:在單執行緒裡邊,遇到i/o操作就切換,遇到i/o操作就切換,,當i/o操作處理完了之後,再自動切回去,怎麼切回去的呢?

協程的使用

greenlet實現手動切換協程

from greenlet import greenlet

deftest1()

:print(12

) gr2.switch(

)print(34

) gr2.switch(

)def

test2()

:print(56

) gr1.switch(

)print(78

)gr1 = greenlet(test1)

gr2 = greenlet(test2)

gr1.switch(

)

執行結果

12

5634

78

協程遇到i/o自動切換(gevent)
import gevent

deff1()

:print

('f1()在執行'

) gevent.sleep(2)

print

('切換回了f1()'

)deff2(

):print

('f2()在執行'

) gevent.sleep(1)

print

('切換回了f2()'

)deff3(

):print

('f3()在切換'

) gevent.sleep(0)

# 雖然是0s,但是還是會切換

print

('切換回了f3()'

)gevent.joinall(

[ gevent.spawn(f1)

, gevent.spawn(f2)

, gevent.spawn(f3),]

)

結果

f1(

)在執行

f2()在執行

f3()在切換

切換回了f3(

)切換回了f2(

)切換回了f1(

)

這個程式只花了2s多

使用gevent注意

使用gevent需要注意的是,上面的**gevent.sleep是模仿i/o操作,但是當真的遇到i/o操作,比如socket,就不好使了,需要加補丁,通過匯入monkey,寫上monkey.patch_all()把當前所有的i/o操作做上標記就可以了

使用gevent實現單執行緒下的多socket併發

面試就可以吹一吹,我自己實現了乙個socketserver,面試官問你怎麼實現的,你猜,用多執行緒嗎?只能用多執行緒嗎?我用了協程。

什麼是事件驅動模型

待補充

協程 IO模型

一 協程 1.定義 單執行緒實現併發,可以再應用程式當中控制多個任務的切換 儲存狀態。優點 在應用程式級別的速度要遠遠高於作業系統的切換 缺點 多個任務一旦有乙個任務阻塞住了,沒有及時切換,整個執行緒都將阻塞在原地,該執行緒內的其他任務都不能繼續執行了。所以,在引入協程之後,就需要檢測單執行緒下所有...

協程和IO模型

協程 1.什麼是協程 單執行緒實現併發 在應用程式裡控制多個任務的切換 儲存狀態 優點 應用程式級別速度要遠遠高於作業系統的切換 缺點 多個任務一旦有乙個阻塞沒有切,整個執行緒都阻塞在原地 該執行緒內的其他的任務都不能執行了 一旦引入協程,就需要檢測單執行緒下所有的io行為,實現遇到io就切換,少乙...

併發程式設計 協程 池,io模型

一 執行緒池 程序池 開程序 開執行緒都需要消耗資源,只不過兩者比較的情況執行緒消耗的資源比較少 在計算機能夠承受範圍之內最大限度的利用計算機 什麼是池?在保證計算機硬體安全的情況下最大限度的利用計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 硬體的發展跟不上軟體的速度 呼叫fro...