39 網路IO模型

2022-08-31 16:48:27 字數 4718 閱讀 3630

"""

我們這裡研究的io模型都是針對網路io的

* blocking io 阻塞io

* nonblocking io 非阻塞io

* io multiplexing io多路復用

* signal driven io 訊號驅動io

* asynchronous io 非同步io

由signal driven io(訊號驅動io)在實際中並不常用,所以主要介紹其餘四種io model。

"""#1)等待資料準備 (waiting for the data to be ready)

#2)將資料從核心拷貝到程序中(copying the data from the kernel to the process)

同步非同步

阻塞非阻塞

常見的網路阻塞狀態:

accept

recv

recvfrom

send雖然它也有io行為 但是不在我們的考慮範圍

"""

我們之前寫的都是阻塞io模型 協程除外

"""import socket

server = socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(5)

while true:

conn, addr = server.accept()

while true:

try:

data = conn.recv(1024)

if len(data) == 0:break

print(data)

conn.send(data.upper())

except connectionreseterror as e:

break

conn.close()

# 在服務端開設多程序或者多執行緒 程序池執行緒池 其實還是沒有解決io問題

該等的地方還是得等 沒有規避

只不過多個人等待的彼此互不干擾

要自己實現乙個非阻塞io模型

"""import socket

import time

server = socket.socket()

server.bind(('127.0.0.1', 8081))

server.listen(5)

server.setblocking(false)

# 將所有的網路阻塞變為非阻塞

r_list =

del_list =

while true:

try:

conn, addr = server.accept()

except blockingioerror:

# time.sleep(0.1)

# print('列表的長度:',len(r_list))

# print('做其他事')

for conn in r_list:

try:

data = conn.recv(1024) # 沒有訊息 報錯

if len(data) == 0: # 客戶端斷開鏈結

conn.close() # 關閉conn

# 將無用的conn從r_list刪除

continue

conn.send(data.upper())

except blockingioerror:

continue

except connectionreseterror:

conn.close()

# 揮手無用的鏈結

for conn in del_list:

r_list.remove(conn)

del_list.clear()

# 客戶端

import socket

client = socket.socket()

client.connect(('127.0.0.1',8081))

while true:

client.send(b'hello world')

data = client.recv(1024)

print(data)

總結

"""

雖然非阻塞io給你的感覺非常的牛逼

但是該模型會 長時間占用著cpu並且不幹活 讓cpu不停的空轉

我們實際應用中也不會考慮使用非阻塞io模型

任何的技術點都有它存在的意義

實際應用或者是思想借鑑

"""

"""

當監管的物件只有乙個的時候 其實io多路復用連阻塞io都比比不上!!!

但是io多路復用可以一次性監管很多個物件

server = socket.socket()

conn,addr = server.accept()

監管機制是作業系統本身就有的 如果你想要用該監管機制(select)

需要你匯入對應的select模組

"""import socket

import select

server = socket.socket()

server.bind(('127.0.0.1',8080))

server.listen(5)

server.setblocking(false)

read_list = [server]

while true:

r_list, w_list, x_list = select.select(read_list, , )

"""幫你監管

一旦有人來了 立刻給你返回對應的監管物件

"""# print(res) # (, , )

# print(server)

# print(r_list)

for i in r_list: #

"""針對不同的物件做不同的處理"""

if i is server:

conn, addr = i.accept()

# 也應該新增到監管的佇列中

else:

res = i.recv(1024)

if len(res) == 0:

i.close()

# 將無效的監管物件 移除

read_list.remove(i)

continue

print(res)

i.send(b'heiheiheiheihei')

# 客戶端

import socket

client = socket.socket()

client.connect(('127.0.0.1',8080))

while true:

client.send(b'hello world')

data = client.recv(1024)

print(data)

總結

"""

監管機制其實有很多

select機制 windows linux都有

poll機制 只在linux有 poll和select都可以監管多個物件 但是poll監管的數量更多

上述select和poll機制其實都不是很完美 當監管的物件特別多的時候

可能會出現 極其大的延時響應

epoll機制 只在linux有

它給每乙個監管物件都繫結乙個**機制

一旦有響應 **機制立刻發起提醒

針對不同的作業系統還需要考慮不同檢測機制 書寫**太多繁瑣

有乙個人能夠根據你跑的平台的不同自動幫你選擇對應的監管機制

selectors模組

"""

"""

非同步io模型是所有模型中效率最高的 也是使用最廣泛的

相關的模組和框架

模組:asyncio模組

非同步框架:sanic tronado twisted

速度快!!!

"""import threading

import asyncio

@asyncio.coroutine

def hello():

print('hello world %s'%threading.current_thread())

yield from asyncio.sleep(1) # 換成真正的io操作

參考**,稍微了解即可

39 網路程式設計

http協議,hyper text transfer protocol 超文字傳輸協議 是用於從全球資訊網伺服器傳送超文字到本地瀏覽器的傳輸議,http是乙個應用層協議,由請求和響應構成,是乙個標準的客戶端伺服器模型。c s模式 client和server常常分別處在相距很遠的兩台計算機上,clie...

計網 問題3 網路模型 I O復用

io復用是一種機制,簡單說就是io事件的到來 讀寫 異常等情況都有核心幫你監控了,應用程式只需要處理那些核心通知你的io控制代碼即可,這種機制的前提是即使建立數萬連線,某時刻可讀寫的fd數量只佔總連線量的很小的比例,因此借助於核心事件驅動機制,就可以實現單執行緒的數萬socket的管理。舉個例子 網...

9 1 1 網路模型

9.1.1 osi七層模型。1.應用層 一般指應用程式,該層主要負責確定通訊物件。常用協議有ftp,http,snmp 2.表示層 資料的編碼和轉化,根據不同的應用目的將資料處理為不同格式,表現出各種副檔名。3.會話層 負責在網路中的兩個結點之間建立,維護,控制會話。提供單工,半雙工,全雙工 x,h...