非阻塞io模型和io多路复用----select
一。四种io阻塞
1.io阻塞:
(1 等待数据处于阻塞状态
(2从内核copy到用户态处于阻塞状态
2.非io阻塞
只有从内核copy到用户态处于阻塞状态
3.io多路复用-----》优势:可以同时监听多个对象
(1从check-----》ready 通过selec函数来做,处于阻塞状态
(2从内核copy到用户态处于阻塞状态
3.异步io
不用阻塞
二。io多路复用
select poll epoll 都属于io同步里面的io多路复用
select:轮询问题,监听数量有限
poll:提高了监听数量
epoll:解决了轮询问题
======================================================================================
服务器端1
#_author:来童星
#date:2019/12/28
#非阻塞io模型
import socket
import time
sk=socket.socket()
address=('127.0.0.1',8080)
sk.bind(address)
sk.listen(3)
sk.setblocking(False)#将阻塞变为非阻塞
while 1:
try:
coon,addr=sk.accept()
print(addr)
#while 1:
data=coon.recv(1024)
print(data.decode('utf8'))
coon.close()
#coon.sendall(data.upper())
except Exception as e:
print('Error:',e)
time.sleep(3)
客户端1
#_author:来童星
#date:2019/12/28
import socket
sk=socket.socket()
address=('127.0.0.1',8080)
sk.connect(address)
while 1:
#inp=input('>>')
sk.sendall('hello server'.encode('utf8'))
data=sk.recv(1024)
print(data.decode('utf8'))
#ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。
=============================================================================
select server端
#_author:来童星
#date:2019/12/28
#io多路复用----》水平触发,边缘触发
#select用的是水平触发
import socket
import select
sk1=socket.socket()
address1=('127.0.0.1',8080)
sk1.bind(address1)
sk1.listen(3)
sk2=socket.socket()
address2=('127.0.0.1',8081)
sk2.bind(address2)
sk2.listen(3)
r,w,e=select.select([sk1,sk2],[],[])
print('rrr')
for obj in r:
coon,addr=obj.accept()
print(addr)
coon.sendall('hello client'.encode('utf8'))
#coon--->client端信息
#r------》sk对象
select client端:
#_author:来童星
#date:2019/12/28
import socket
sk=socket.socket()
address=('127.0.0.1',8080)
sk.connect(address)
while 1:
data=sk.recv(1024)
print(data.decode('utf8'))
inp = input('>>')
sk.sendall(inp.encode('utf8'))
==================================================================