how to use linux epoll with python

  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() 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章