"""
我們這裡研究的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...