為什麼要有協程?
因為想要在單執行緒內實現併發的效果。
因為cpthon有gil鎖,限制了在同乙個時間點,只能執行乙個執行緒
所以想要在執行乙個執行緒的期間,充分的利用cpu的效能
所以才有了想在單執行緒內實現併發的效果。
併發:切換+儲存狀態
cpu是為什麼要切換?
1 因為某個程式阻塞了
2 因為某個程式用完了時間片
很明顯 解決1 這個問題才能提高效率
所以想要實現單執行緒的併發,就要解決在單執行緒內,多個任務函式中,某個任務函式遇見io操作,馬上自動切換到其他任務函式去執行。
協程:是乙個比執行緒更加輕量級的單位,是組成執行緒的各個函式
協程本身沒有實體
greenlet模組:能簡單的實現函式與函式之間的切換,但是遇到io操作,不能自動切換到其他函式中
(1) 註冊一下函式func,將函式註冊成乙個物件f1
f1 = greenlet(func)
(2) 呼叫func,使用f1.switch(),如果func需要傳參,就在switch這裡傳即可
gevent模組:可以實現在某函式內部遇到io操作,就自動的切換到其他函式內部去執行
g = gevent.spawn(func,引數) 註冊一下函式func,返回乙個物件g
gevent.join(g) #等待g指向的函式func執行完畢,如果在執行過程中,遇到io,就切換
gevent.joinall([g1,g2,g3])#等待g1 g2 g3指向的函式func執行完畢
大的總結:協程是由使用者自己去排程的,
面試題:
已經學習過了程序,執行緒,協程
計算密集用多程序,可以充分利用多核cpu的效能,
io密集用多執行緒(注意,協程是在單執行緒的)
多執行緒和協程的區別是:
執行緒是由作業系統排程,控制
協程是由程式設計師自己排程,控制
io多路復用
阻塞io
非阻塞io
多路復用io
非同步io python實現不了,但是有tornado框架,天生自帶非同步
面試題:
select 和 poll 和epoll的區別
select和poll有乙個共同的機制,都是採用輪訓的方式去詢問核心,有沒有資料準備好了
select有乙個最大監聽事件的限制,32位機限制1024,,6位機限制2048
poll沒有,理論上poll可以開啟無限大,1g記憶體大概夠你開10w個事件去監聽
epoll是最好的,採用的是**機制,解決了select和poll共同存在的問題
而且epoll理論上也可以開啟無限多個監聽事件
併發的本質:切換 + 儲存狀態
Linux IO多路復用
一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
Linux C Socket多路復用
1.迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.socket bind while 1 因為udp是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...