1. 程式人生 > >IO 模型--非阻塞IO--day37

IO 模型--非阻塞IO--day37

"""
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()) clients.append(client) except BlockingIOError: # sleep(0.1) # print("還沒有資料可以處理 那就幹別的事情去")
# 執行except 說明伺服器沒有請求可以處理 可以去處理客戶端通訊 # 已經關閉的 需要刪除的客戶端 close_ls = [] # 接收資料的迴圈 for c in clients: try: data = c.recv(1024) if not data: c.close() close_ls.append(c) continue # 不能直接發 因為作業系統快取如果滿了 會拋異常 # c.send(data.upper()) msg_ls.append((c, data)) except BlockingIOError: pass except ConnectionResetError: c.close() close_ls.append(c) # 遍歷完成後 刪除關閉的連線 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()) rm_msg.append(i) print("傳送成功!") except BlockingIOError: print("傳送失敗!") # 清理已經發送過的資料! for msg in rm_msg: msg_ls.remove(msg) rm_msg.clear()
    4.非同步IO   ???

"""