IO模型 IO多路復用

2022-02-05 04:17:33 字數 2302 閱讀 6023

用socket 一定會用到accept recv recvfrom這些方法

正常情況下 accept recv recvfrom都是阻塞的

如果setblocking(false) 整個程式就變成乙個非阻塞的程式了
非阻塞的特點:沒有併發程式設計的機制

是乙個同步的程式

程式不會在某乙個連線的recv或者sk的accept上進行阻塞

缺點:

太多while true 高速執行著

大量的占用了cpu導致了資源的浪費

阻塞io的問題:

一旦阻塞就不能做其他事情了

非阻塞io的問題:

給cpu造成了很大的負擔

))sk.setblocking(false) # 設定當前的socket server為乙個非阻塞io模型

sk.listen()

conn_l =

del_l =

while

true:

try:

conn,addr =sk.accept()

except blockingioerror:

for conn in

conn_l: # [conn1,conn2]

try:

conn.send(b

'hello')

print(conn.recv(

1024

)) except (nameerror,blockingioerror):pass

except connectionreseterror:

conn.close()

for del_conn in

del_l:

conn_l.remove(del_conn)

del_l.clear()

io多路復用機制

select windows、mac\linux

底層是作業系統的輪詢

有監聽物件個數的限制

隨著監聽物件的個數增加,效率降低

poll mac\linux

底層是作業系統的輪詢

有監聽物件個數的限制,但是比select能監聽的個數多

隨著監聽物件的個數增加,效率降低

epoll mac\linux

給每乙個要監聽的物件都繫結了乙個**函式

不再受到個數增加 效率降低的影響

# 模組 用來操作作業系統中的select(io多路復用)機制

import socket

sk =socket.socket()

sk.bind((

'127.0.0.1

',9000

))sk.setblocking(false)

sk.listen()

r_lst =[sk,]

print(sk)

while

true:

r_l,_,_ = select.select(r_lst,,) # r_lst =[sk,conn1,conn2,conn3]

for item in

r_l:

if item is

sk: conn, addr =sk.accept()

else

:

try:

print(item.recv(

1024

)) item.send(b

'hello')

except connectionreseterror:

item.close()

r_lst.remove(item)

IO模型 多路復用

乙個輸入操作通常包括兩個階段 應用程序被阻塞,直到資料從核心緩衝區複製到應用程序緩衝區中才返回。應該注意到,在阻塞的過程中,其它應用程序還可以執行,因此阻塞不意味著整個作業系統都被阻塞。因為其它應用程序還可以執行,所以不消耗 cpu 時間,這種模型的 cpu 利用率會比較高。應用程序執行系統呼叫之後...

IO模型 io多路復用(三)

兩者相互比較 1 如果只有乙個使用者連線server端,多路復用io還不如阻塞io效率高 2 相比阻塞io,多路復用io中間多了個反饋機制 3 多路復用io的 可以同時監控socket 多個socket物件coon1 coon2.recv 4 多路復用io可以識別有人連線某個coon3,然後告知有c...

IO多路復用 select模型

客戶端 見 c s通訊 伺服器阻塞型使用 伺服器端 include include include include include include include include include include include include int main set local address m...