IO多路复用
Posted liliudong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 select sk = 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 Thread def 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上没有 ]
- 高端的
- 并不是循环每一个项目进行监听
- 而是为每一个项目增加回调函数
- 有信号来直接进行回调函数,所以效率比循环高
以上是关于IO多路复用的主要内容,如果未能解决你的问题,请参考以下文章