"""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 表示...