• 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
    
  • 相关阅读:
    Python导学基础(三)输入、格式化输出、基本运算符
    题解-FJOI2014 树的重心
    题解-CF1307G Cow and Exercise
    题解-SHOI2005 树的双中心
    笔记-CF643E Bear and Destroying Subtrees
    题解-CF643G Choosing Ads
    扩展Lucas
    线性筛筛积性函数
    整除分块(数论)
    2019暑假集训DAY17(problem2.b)(杜教筛)
  • 原文地址:https://www.cnblogs.com/hanfei-1005/p/5708205.html
Copyright © 2020-2023  润新知