python异步机制(三)——I/O多路复用
select
select通过一个select()系统调用来监视多个文件描述符组成的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,select本质上是通过设置或检查存放fd标志位的数据结构来进行下一步处理
优点:
- 具有良好的跨平台性
缺点:
- 单个进程可监视的fd数量被限制(在Linux上一般为1024)
- 需要维护一个用来存放大量fd的数据结构(数组:线性表),使得用户空间和消耗大
服务器端:
#!/usr/bin/python
#coding=utf-8
import socket,sys,select,Queue
host = (sys.argv[1], int(sys.argv[2]))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#阻塞与端口复用
sock.setblocking(False)
#SOL_SOCKET(套接字描述符),SO_REUSEADDR(端口复用,让端口释放后可以被立即使用)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(host)
sock.listen(5)
rlist = [sock]
wlist = []
msg_que = {}
timeout = 60
while True:
rs, ws ,es = select.select(rlist, wlist, rlist, timeout)
if not (rs or ws or es):
print "timeout..."
continue
for r in rs:
if r is