方法1: select(rlist,wlist,xlist)方法(用的多)
特点
优点:跨平台性好(win linux unix)
缺点:效率一般(每次监控IO都需要将应用层关注的IO映射给内核处理,应用层处理就绪IO时需要再次轮寻),最多监控1024个IO
流程
- 将关注的IO放入对应的监控类别列表
- 通过select函数进行监控
- 遍历select返回值列表,确定就绪IO事件
- 处理发生的IO事件
代码
from socket import *
from select import select #python用select模块实现io多路复用
#创建监听套接字作为IO对象(读类型)
s = socket()
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #设置端口可以复用
s.bind(('0.0.0.0',8888))
s.listen(3)
#设置关注列表
rlist = [s] #监听套接字:s 只有读操作,等待客户端连接
wlist = []
xlist = []
#循环监听不同客户端发过来的请求,使s监听套接字一直处于r[0]就绪状态
while True:
#监控IO发生
#select函数语法:rs,ws,ws=select(rlist,wlist,xlist[,timeout])
rs,ws,xs = select(rlist,wlist,xlist) #监控新发过来的s监听套接字和c连接套接字,返回他们的就绪状态
for r in rs:
if r is s: #分情况讨论,如果是监听套接字,说明由客户端连接服务端,做以下事情(只能读)
#接收连接
c,addr = r.accept() #rs[0]表示准备就绪了的s监听套接字,c的本质是客户端给服务端发消息
print('Connect from',addr)
rlist.append(c) #将新生成的c套接字添加到读监听列表rlist中,让操作系统去监控
else: