how to use linux epo

发布时间:2019-07-06 10:45:21编辑:auto阅读(2053)

    1. #!/usr/bin/python  
    2. # -*- coding:utf-8 -*- 
    3.  
    4. import socket, select 
    5.  
    6. EOL1 = b'\n\n' 
    7. EOL2 = b'\n\r\n' 
    8. response  = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n' 
    9. response += b'Content-Type: text/plain\r\nContent-Length: 13\r\n\r\n' 
    10. response += b'Hello, world!' 
    11.  
    12. serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    13. serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1
    14. serversocket.bind(('0.0.0.0'8080)) 
    15. serversocket.listen(1
    16. serversocket.setblocking(0
    17.  
    18. epoll = select.epoll() 
    19. epoll.register(serversocket.fileno(), select.EPOLLIN) 
    20.  
    21. try
    22.   connections = {}; requests = {}; responses = {} 
    23.  
    24.   while True
    25.      events = epoll.poll(1
    26.  
    27.      for fileno, event in events: 
    28.         if fileno == serversocket.fileno(): 
    29.            connection, address = serversocket.accept() 
    30.            connection.setblocking(0
    31.            epoll.register(connection.fileno(), select.EPOLLIN) 
    32.  
    33.            connections[connection.fileno()] = connection 
    34.            requests[connection.fileno()] = b'' 
    35.            responses[connection.fileno()] = response 
    36.  
    37.         elif event & select.EPOLLIN: 
    38.            requests[fileno] += connections[fileno].recv(1024
    39.  
    40.            if EOL1 in requests[fileno] or EOL2 in requests[fileno]: 
    41.               epoll.modify(fileno, select.EPOLLOUT) 
    42.               print('-'*40 + '\n' + requests[fileno].decode()[:-2]) 
    43.  
    44.         elif event & select.EPOLLOUT: 
    45.            byteswritten = connections[fileno].send(responses[fileno]) 
    46.            responses[fileno] = responses[fileno][byteswritten:] 
    47.  
    48.            if len(responses[fileno]) == 0
    49.               epoll.modify(fileno, 0
    50.               connections[fileno].shutdown(socket.SHUT_RDWR) 
    51.  
    52.         elif event & select.EPOLLHUP: 
    53.            epoll.unregister(fileno) 
    54.            connections[fileno].close() 
    55.            del connections[fileno] 
    56.  
    57. finally
    58.   epoll.unregister(serversocket.fileno()) 
    59.   epoll.close() 
    60.   serversocket.close() 
    转载自:http://scotdoyle.com/python-epoll-howto.html.  python epoll编程基本上都是从这篇文章开始。
     
    epoll流程:
    创建socket
      -->绑定socket并监听
          -->创建epoll对象
              -->注册socket到epoll对象,使用epoll的注册函数对socket进行管理
                  -->服务器进入循环
                    -->epoll对象轮询注册的socket队列(即:已经就绪的socket队列)
                      -->判断socket是否是新加入的
                         ->新加入socket:创建socket对象,并调用accept(),然后把socket注册到epoll
                         ->非新socket,且socket状态为可读,调用recv()。如果接收到的消息包含中断或exit等字符,修改socket状态
                         ->非新socket,且状态为可写,调用send函数。
                         ->非新socket,且状态为HUP,从注册函数中删除socket,并调用close() 

关键字