一、阻塞io模型
importsocket
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
(data)
conn.send(data.upper())
except
connectionreseterror as e:
break
conn.close()
#在服務端開設多程序或者多執行緒 程序池執行緒池 其實還是沒有解決io問題
該等的地方還是得等 沒有規避
只不過多個人等待的彼此互不干擾
二、非阻塞io模型
importsocket
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)
(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,還能優雅地寫 嗎?那我就帶你來回顧一下這一切是怎麼發生的。從哪開始說好呢?我們就從 前端打包 開始吧。前端打包 很久以前 也就五年左右吧,但是五年前端已經大變樣了 頁面的 ...