一。四种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 socketimport timesk=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/28import socketsk=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 socketimport selectsk1=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/28import socketsk=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‘))
==================================================================
原文地址:https://www.cnblogs.com/startl/p/12111279.html
时间: 2024-11-07 21:33:52