深入理解非同步I O epoll 協程

2022-06-14 02:00:30 字數 2449 閱讀 1961

同步和非同步的概念描述的是使用者執行緒與核心的互動方式:同步是指使用者執行緒發起io請求後需要等待或者輪詢核心io操作完成後才能繼續執行;而非同步是指使用者執行緒發起io請求後仍繼續執行,當核心io操作完成後會通知使用者執行緒,或者呼叫使用者執行緒註冊的**函式。

阻塞和非阻塞的概念描述的是使用者執行緒呼叫核心io操作的方式:阻塞是指io操作需要徹底完成後才返回到使用者空間;而非阻塞是指io操作被呼叫後立即返回給使用者乙個狀態值,無需等到io操作徹底完成。

在理解非同步i/o之前,我們先要知道什麼是同步i/o

阻塞同步i/o模型下,使用者執行緒向核心發起 recvfrom 系統呼叫,當資料沒有準備好的時候,使用者執行緒阻塞。

此外還有一種非阻塞同步i/o,此時使用者執行緒不阻塞於 recvfrom,而是反覆向系統查詢資料狀態。當資料準備好了,就對資料進行後續處理。

而在非同步i/o模式下,使用者執行緒在資料還沒有準備好的時候既不阻塞也不反覆查詢,而是繼續幹自己該幹的事情。核心會開啟乙個核心執行緒去讀取資料,等到資料準備好了,核心給使用者執行緒乙個訊號,使用者執行緒中斷去執行訊號處理函式。

node.js中的非同步**也是採用開執行緒的方式實現的

epoll/select 是一種i/o多路復用模型

使用者執行緒可以先通過 epoll註冊多個i/o事件

然後使用者執行緒反覆執行呼叫 epoll/select 查詢是否有準備好的事件

如果有準備好的i/o事件則進行處理

關鍵點是乙個使用者執行緒處理多個i/o事件

epoll/select 的區別在於

select 的底層原理是遍歷所有註冊的i/o事件,找出準備好的的i/o事件。

而 epoll 則是由核心主動通知哪些i/o事件需要處理,不需要使用者執行緒主動去反覆查詢,因此大大提高了事件處理的效率。

協程是一種輕量級的執行緒

本質上協程就是使用者空間下的執行緒

如果把執行緒/程序當作虛擬「cpu」,協程即跑在這個「cpu」上的執行緒。

協程的特點

占用的資源更少。

所有的切換和排程都發生在使用者態。

不管是程序還是執行緒,每次阻塞、切換都需要陷入系統呼叫,先讓cpu跑作業系統的排程程式,然後再由排程程式決定該跑哪乙個執行緒。而且由於搶占式排程執行順序無法確定的特點,使用執行緒時需要非常小心地處理同步問題,而協程完全不存在這個問題。

因為協程可以在使用者態顯示控制切換

例子

傳統的生產者-消費者模型是乙個執行緒寫訊息,乙個執行緒取訊息,通過鎖機制控制佇列和等待,但一不小心就可能死鎖。

如果改用協程,生產者生產訊息後,直接通過yield跳轉到消費者開始執行,待消費者執行完畢後,切換回生產者繼續生產,效率極高:

import time

def consumer():

r = ''

while true:

n = yield r

if not n:

return

print('[consumer] consuming %s...' % n)

time.sleep(1)

r = '200 ok'

def produce(c):

c.next()

n = 0

while n < 5:

n = n + 1

print('[producer] producing %s...' % n)

r = c.send(n)

print('[producer] consumer return: %s' % r)

c.close()

if __name__=='__main__':

c = consumer()

produce(c)

協程的優點是可以用同步的處理方式實現非同步**的效能

深入理解 執行緒,程序,協程和並行,併發 協程

爬蟲的併發控制 多程序 多執行緒 協程 yield 從硬體 雙核四執行緒 超執行緒技術 有兩個cpu核心,每個核心有兩個邏輯處理器,相當於有四個cpu核心 四核四執行緒 有乙個cpu核心,每個核心有乙個邏輯處理器,相當於有四個cpu核心 從作業系統 程序和執行緒,都是cpu任務的執行單位。程序 早期...

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

非同步I O 協程

什麼是協程呢?協程 coroutines 是一種比執行緒更加輕量級的存在,正如乙個程序可以擁有多個執行緒一樣,乙個執行緒可以擁有多個協程。協程不是被作業系統核心所管理的,而是完全由程式所控制,也就是在使用者態執行。這樣帶來的好處是效能大幅度的提公升,因為不會像執行緒切換那樣消耗資源。協程不是程序也不...