理论方法
基于 IO 多路复用, Windows 中使用 select 实现, Linux 中使用 select,pool,epoll 实现.
Windows 中使用 select, 最多能监听 1024 个文件句柄, 使用轮询检测;
Linux 中使用 select 最多能监听 1024 个文件句柄, 使用轮询检测; pool, 监听个数不限制; epoll 使用边缘触发, 回调通知
IO 多路复用 - 扩展知识
官方定义: 帮助开发者监听多个 IO 句柄发生变化, 用于帮助我们监听多个 socket 是否发生变化 (连接服务器的 socket, 和发送消息的 socket)
为什么使用 IO 多路复用: 在单线程中, 由于我们使用服务端与多个客户端收发消息时, 由于 python 的代码是由上往下执行的, 因此当服务端和第一个客户端收发消息时, 服务端会处于 accept 这个状态, 这样会造成等待, 第二个客户端肯定不能和服务端进行交互, 为了解决这个问题, 引出了 IO 多路复用.
代码实现
- import socket
- import select
- # 可以连接很多个用户
- sk1=socket.socket()
- sk2=socket.socket()
- sk1.bind(('127.0.0.1',8001))
- sk2.bind(('127.0.0.1',8002))
- while True:
- rlist,w,e=select,select([sk1,conn1,conn2],[],5)
- for sk in rlist:
- if sk==sk1:
- # 服务端 socket 发生变化, 新用户来连接
- conn,addr=sk.accept()
- conn.send('hello')
- else:
- # 客户端 socket 发生变化, 老用户发来了消息
- data=sk.recv()
来源: http://www.bubuko.com/infodetail-3068820.html