42 IO模型發展史

2022-07-22 09:24:08 字數 4031 閱讀 7810

一、阻塞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)

```**總結**```python

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

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

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

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

實際應用或者是思想借鑑

三、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)

```**總結**

```python

"""監管機制其實有很多

select機制 windows linux都有

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

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

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

epoll機制 只在linux有

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

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

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

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

selectors模組

四、非同步io模型

非同步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操作

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

loop = asyncio.get_event_loop()

tasks = [hello(),hello()]

loop.run_until_complete(asyncio.wait(tasks))

loop.close()

IT薪水發展史

1k 兄弟別做it了,不論你是什麼公司,國營的做it就是配角,那位兄弟願意一輩子做配角,非國營的嗎,看看做什麼別的合適,it不好混,趁早離開 1k 3k 初級階段,一般是剛進公司的,肯定非常缺錢,這時候動力足,也有時間,沒有男 女朋友拖累,象公司內部5k 6k的高手學習。什麼,沒有,什麼爛公司,你也...

記憶體發展史

記憶體 容量 指標 時期出現原因 simm記憶體 30pin 256kb 1982年至今 軟體程式和新一代80286硬體平台的出現 simm記憶體 72pin 512kb 2mb 1988 1990 pc迎來386和486時代,cpu向16bit發展 edo dram 4 16mb 電壓 5v 頻寬...

前端發展史

不知道什麼時候開始,前端開發已經到了不開乙個 watcher 就無法工作的地步了。不依賴 gulp babel webpack,還能優雅地寫 嗎?那我就帶你來回顧一下這一切是怎麼發生的。從哪開始說好呢?我們就從 前端打包 開始吧。前端打包 很久以前 也就五年左右吧,但是五年前端已經大變樣了 頁面的 ...