非阻塞io模型和io多路复用----select

Posted startl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞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‘))

技术图片

技术图片


==================================================================

以上是关于非阻塞io模型和io多路复用----select的主要内容,如果未能解决你的问题,请参考以下文章

多路复用IO模型 IO multiplexing

[Linux网络编程]多路IO复用Epoll Select问题补充

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

五种网络IO模型以及多路复用IO中select/epoll对比

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO

非阻塞套接字与IO多路复用