IO多路复用
IO多路复用 -利用内置模块select[Windows Linux]
-
循环每一个被监听的项目,看看是否有读写错误操作
-
所以随着监听项目的增多,效率将变差
-
服务器端
-
select必须传入三个参数分别是三个列表
read_list, write_list, erro_list返回值是一个元祖对应传入的参数select帮助感知某个IO操作是否有变动
read开始被read
write开始被write
erro开始有erro
一但感知到就会返回响应的参数
import socket
from select import selectsk = socket.socket()
address = ('127.0.0.1', 8080)
sk.bind(address)
sk.setblocking(False)
sk.listen() #监听read_ls = [sk] #将sk对象加入一个列表
while 1:
r_ls, w_ls, x_ls = select(read_ls, [], [])
for i in r_ls:
if i is sk:
conn, addr = i.accept()
read_ls.append(conn)
else:
ret = i.recv(1024) #接收消息
if ret == b'':
read_ls.remove(i)
i.close()
continue
print(ret)
i.send(b'byebye!') #发送消息 -
客户端 -起多线程的客户端
import socket
from threading import Threaddef func():
sk = socket.socket()
address = ('127.0.0.1', 8080)
sk.connect(address)
sk.send(b'hello')
ret = sk.recv(1024)
print(ret)
sk.close()t_ls = []
for i in range(10):
t = Thread(target=func)
t.start()
其他类似的模块
poll -[Linux]
- 和
select机制基本上一样 - 但是
poll监听的对象比select监听上限多
epol -[Linux][Windows上没有 ]
- 高端的
- 并不是循环每一个项目进行监听
- 而是为每一个项目增加回调函数
- 有信号来直接进行回调函数,所以效率比循环高

浙公网安备 33010602011771号