IO 模型 非阻塞IO day37

2022-09-19 22:21:21 字數 2007 閱讀 9282

"""

io 模型

什麼是io 指的是輸入輸出,其執行速度都非常慢

模型,指固定的套路

io模型 就是 所有可以實現輸入輸出的套路

io的分類

1.本地io 指的是輸入輸出到本地計算機 比如寫入硬碟

2.網路io 指的是輸入輸出到 網路中的計算機 速度遠比本地io慢(*****)

網路io的輸入輸出過程

io模型(******):

1.阻塞型io

之前學習的io操作處理gevent都是阻塞型的

1.可以利用多執行緒來提高效率

執行緒數量不能太多 會造成記憶體溢位

2.執行緒池可以解決執行緒太多的問題

但是如果執行緒池數量達到最大 其他客戶端將進入等待

3.在單執行緒併發的來處理 可以使單核下的效率最高

2.非阻塞io

#

----非阻塞io-----

import

socket, time

from time import

sleep

server =socket.socket()

server.bind((

"127.0.0.1

", 21211))

server.listen()

server.setblocking(false)

#儲存所有的客戶端

clients =

#需要傳送的資料

msg_ls =

while

true:

#需要接收三次握手資料 所以也是乙個阻塞 必須經歷wait 和 copy

try:

client, addr =server.accept()

print("

來了乙個客戶端....")

#每次執行到這個**的時候 client的值都是乙個新的值 則意味只能處理本次的新的客戶端

#while true:

#client.send(client.recv(1024).upper())

except

blockingioerror:

#sleep(0.1) #

print("

還沒有資料可以處理 那就幹別的事情去")

#執行except 說明伺服器沒有請求可以處理 可以去處理客戶端通訊

#已經關閉的 需要刪除的客戶端

close_ls =

#接收資料的迴圈

for c in

clients:

try:

data = c.recv(1024)

ifnot

data:

c.close()

continue

#不能直接發 因為作業系統快取如果滿了 會拋異常

#c.send(data.upper())

except

blockingioerror:

pass

except

connectionreseterror:

c.close()

#遍歷完成後 刪除關閉的連線

for i in

close_ls:

clients.remove(i)

close_ls.clear()

#傳送資料的迴圈

#儲存已經傳送過的資料

rm_msg =

for i in

msg_ls:

try:

i[0].send(i[1].upper())

print("

傳送成功!")

except

blockingioerror:

print("

傳送失敗!")

#清理已經傳送過的資料!

for msg in

rm_msg:

msg_ls.remove(msg)

rm_msg.clear()

4.非同步io   ???

"""

非阻塞IO模型

include include include include include include in.h include include include include include using namespace std define maxsize 2048std queue socketqu...

io模型 非阻塞模型

linux下,可以通過設定socket使其變為non blocking。當對乙個non blocking socket執行讀操作時,流程是這個樣子 從圖中可以看出,當使用者程序發出read操作時,如果kernel中的資料還沒有準備好,那麼它並不會block使用者程序,而是立刻返回乙個error。從使...

PythonStudy 非阻塞IO模型

服務端 import socket import time import select server socket.socket server.bind 127.0.0.1 1688 server.listen 5 server.setblocking false 預設為阻塞 設定為false 表示...