欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python 并發編程 多路復用IO模型詳解

系統 1826 0

多路復用IO(IO multiplexing)

這種IO方式為事件驅動IO(event driven IO)。

我們都知道,select/epoll的好處就在于單個進程process就可以同時處理多個網絡連接的IO。它的基本原理就是select/epoll這個function會不斷的輪詢所負責的所有socket,當某個socket有數據到達了,就通知用戶進程。它的流程如圖:

python 并發編程 多路復用IO模型詳解_第1張圖片

select是多路復用的一種

當用戶進程調用了select,那么整個進程會被block,而同時,kernel會“監視”所有select負責的socket,
當任何一個socket中的數據準備好了,select就會返回。這個時候用戶進程再調用read操作,將數據從kernel拷貝到用戶進程。
這個圖和blocking IO的圖其實并沒有太大的不同,事實上還更差一些。因為這里需要使用兩個系統調用\(select和recvfrom\),
而blocking IO只調用了一個系統調用\(recvfrom\)。但是,用select的優勢在于它可以同時處理多個connection。

多路復用IO比較阻塞IO模型:

1.阻塞IO經歷兩個階段 wait data,copy data

2.多路復用3個階段 wait data,ready copy data, copy data

單連接套接字通信 阻塞IO效率高

多路復用IO select可以代理多個套接字連接,多個套接字通信,多路復用IO效率高

強調:

1. 如果處理的連接數不是很高的話,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延遲還更大。select/epoll的優勢并不是對于單個連接能處理得更快,而是在于能處理更多的連接。

2. 在多路復用模型中,對于每一個socket,一般都設置成為non-blocking,但是,如上圖所示,整個用戶的process其實是一直被block的。只不過process是被select這個函數block,而不是被socket IO給block。

結論: select的優勢在于可以處理多個連接,性能高,同時可以檢測多個套接字IO行為,不適用于單個連接

select網絡IO模型示例

select 檢測多個套接字IO行為 accept,recv

IO行為兩種:

1.別人給我傳數據

2.給別人發送數據

timeout是超時時間

每隔0.5秒去問操作系統準備好數據沒有

            
def select(rlist, wlist, xlist, timeout=None): 
  pass
# [] 傳的空列表是出異常的列表
# 返回值3個列表 收列表,發列表,異常列表
rl,wl,xl = select.select(rlist, wlist, [], 0.5)
          

客戶端:

            
from socket import *
client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8000))
while True:
  msg = input(">>>:").strip()
  if not msg:continue
  client.send(msg.encode("utf-8"))
  data = client.recv(1024)
  print(data.decode("utf-8"))
client.close()
          

服務端代碼:

            
from socket import *
import select
server = socket(AF_INET,SOCK_STREAM)
server.bind(('127.0.0.1',8000))
server.listen(5)
# 設置socket接口為 非阻塞IO接口
# 默認是True 為阻塞
server.setblocking(False)
# 專門存著收消息套接字
rlist = [server,]
# 存放發送消息套接字
wlist = []
# 存放發送的數據
wdata = {}
while True:
  # 返回值3個列表 收列表,發列表,異常列表
  rl,wl,xl = select.select(rlist, wlist, [], 0.5)
  print("rl",rl)
  print("wl",wl)
  for sock in rl:
    if sock == server:
      conn,addr = sock.accept()
      rlist.append(conn)
    else:
      try:
        data = sock.recv(1024)
        if not data:
          sock.close()
          rlist.remove(sock)
          continue
        # 收的套接字加到列表
        wlist.append(sock)
        # 把數據加到字典 做一個 套接字對應數據
        wdata[sock] = data.upper()

      except Exception:
        sock.close()
        rlist.remove(sock)
  # 發送數據
  for sock in wl:
    sock.send(wdata[sock])
    wlist.remove(sock)
    wdata.pop(sock)
server.close()
          

基于select模塊 檢測套接字IO行為,實現并發效果

select監聽fd變化的過程分析:

用戶進程創建socket對象,拷貝監聽的fd到內核空間,每一個fd會對應一張系統文件表,內核空間的fd響應到數據后,
就會發送信號給用戶進程數據已到;

用戶進程再發送系統調用,比如(accept)將內核空間的數據copy到用戶空間,同時作為接受數據端內核空間的數據清除,
這樣重新監聽時fd再有新的數據又可以響應到了(發送端因為基于TCP協議所以需要收到應答后才會清除)。

該模型的優點:

可以同時檢測多個套接字,效率比阻塞IO,非阻塞IO高了

相比其他模型,使用select() 的事件驅動模型只用單線程(進程)執行,占用資源少,不消耗太多 CPU,同時能夠為多客戶端提供服務。

如果試圖建立一個簡單的事件驅動的服務器程序,這個模型有一定的參考價值。

該模型的缺點:

代理的套接字 列表里的多個套接字,需要循環列表 一個個檢測,

在代理套接字比較少的情況下,循環比較快。但select代理的套接字非常多的情況下,select隨著列表增大,效率就越來越慢

首先select()接口并不是實現“事件驅動”的最好選擇。因為當需要探測的句柄值較大時,select()接口本身需要消耗大量時間去輪詢各個句柄。

很多操作系統提供了更為高效的接口,如linux提供了epoll,BSD提供了kqueue,Solaris提供了/dev/poll,…。
如果需要實現更高效的服務器程序,類似epoll這樣的接口更被推薦。遺憾的是不同的操作系統特供的epoll接口有很大差異,
所以使用類似于epoll的接口實現具有較好跨平臺能力的服務器會比較困難。
其次,該模型將事件探測和事件響應夾雜在一起,一旦事件響應的執行體龐大,則對整個模型是災難性的。

epoll是異步方式實現,提交套接字時候,每個套接字身上都綁定一個回調函數,哪個套接字準備好了,就觸發回調函數,把自己索引放在單獨列表里,對于select來說,只需要去準備好的列表里 根據索引拿到套接字,這樣不需要在列表里每個遍歷。

epoll不支持windows系統

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月婷婷综合在线视频 | 久久亚洲国产欧洲精品一 | 日本精品不卡 | 亚洲国内精品 | 国产精品国产三级国产aⅴ无密码 | 亚洲视频免费 | 国产一级黄色网 | 日韩精品一区在线 | 午夜精品久久久久久 | 中文在线一区 | 91精品国产综合久久欧美 | 欧美一区二区三区免费视频 | 一级毛片免费 | 亚欧精品一区二区三区四区 | 国产精品福利在线观看免费不卡 | 一级一片在线播放在线观看 | 国产肥熟 | 亚洲一区二区中文字幕 | 日本亚洲一区 | 一级片免费观看 | 国产一区二区三区在线观看免费 | 欧美日韩精品一区二区三区视频 | 国产一区二区三区免费播放 | 啪啪激情婷婷久久婷婷色五月 | 污视频网站在线免费看 | 国产精品国偷自产在线 | 91精品国产综合久久久密闭 | 欧美中文字幕一区二区 | 亚洲高清视频在线观看 | 久久一区二区三区99 | 欧美一级网站 | 色老头久久网 | 99精品欧美一区二区三区综合在线 | 狠狠色丁香婷婷综合橹不卡 | 成人免费黄色 | 久草视频手机在线观看 | 91免费在线播放 | 精品国产一区二区三区久久久 | 成人欧美日韩一区二区三区 | 天天躁日日躁很很躁2022 | 亚洲一区二区三区首页 |