40 協程 多路復用

2022-07-01 18:27:12 字數 1341 閱讀 4310

為什麼要有協程?

因為想要在單執行緒內實現併發的效果。

因為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是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...