什麼是事件驅動模型
協程介紹
協程是什麼
協程是微執行緒,他是一種使用者態的輕量級執行緒,它的好處是沒有執行緒切換的開銷,我們開多執行緒,執行緒的上下文切換是耗費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...