Select,poll,epoll复用

Select,poll,epoll复用
1)select模块以列表的形式接受四个参数,分别是可读对象,可写对象,产生异常的对象,和超时设置。当监控符对象发生变化时,select会返回发生变化的对象列表。
eadable有3种可能:对于用来侦听连接主服务器socket,表示已准备好接受一个到来的连接;对于已经建立并发送数据的链接,表示有数据到来;如果没数据到来,表示链接已经关闭。
writable的情况:连接队列中有数据,发送下一条消息。如果队列中无数据,则从output队列中删除。
socket有错误,也要从output队列中删除。


#!/usr/bin/python
import socket
import select
s=socket.socket()
host=socket.gethostname()
port=6666
s.bind((host,port))
s.listen(5)
inputs=[s]
while True:
    rs,ws,es=select.select(inputs,[],[])
    for r in rs:
        if r is s:      #看s是否是本机上用于监听的socket,是则接收链接,不是则接收数据
            c,addr=s.accept()
            print "got connection from ",addr
            inputs.append(c)
        else:
            try:
                data=r.recv(1024)
                disconnected=not data
            except socket.error:
                disconnected=True
            if disconnected:
 				print r.getpeername(),'disconected'
                inputs.remove(r)
            else:
                print data

2)poll方法
在调用poll方法时,会得到一个poll对象,然可以使用poll对象的register方法注册一个文件描述符,(或带有fileno方法的对象),注册以后可以使用unregister方法来移除注册的对象
注册对象以后,就可以调用poll方法,并得到一个(fd,events)格式列表,其中fd是文件描述符,events则告诉你发生了什么。

#!/usr/bin/python
import socket
import select
host=socket.gethostname()
s=socket.socket()
port=1234
s.bind((host,port))
fdmap={s.fileno():s}
s.listen(5)
p=select.poll()
p.register(s)
while True:
    events=p.poll()
    for fd,event in events:
        if fd in fdmap:
            c,addr=s.accpet()
            print "get connection from ",addr
            p.register(c)
            fdmap[c.fileno()]=c
        elif events & select.POLLIN:
            data=fdmap[fd].recv(2048)
            if not data:
                print "fdmap[fd].gethostname()",disconnected
                         
                p.unregister(fd)
                del fdmap[fd]
        else:
            print data

3)epoll方法

#!/usr/bin/python
import socket
import select
if __name__=="__main__":
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    host=socket.gethostname()
    port=6666
    s.bind((host,port))
    s.listen(10)
    epoll=select.epoll()
    print s.fileno()
    print select.EPOLLIN|select.EPOLLET
    epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)
    while 1:
        epoll_list=epoll.poll()
        for fd.events in epoll_list:
            print fd
            print events
            if fd==s.fileno():
                conn,addr=s.accpet()
                print 123
posted @ 2016-07-26 17:14  夏日花开  阅读(180)  评论(0编辑  收藏  举报