zoukankan      html  css  js  c++  java
  • How To Use Linux epoll with Python

    http://scotdoyle.com/python-epoll-howto.html

    Line 1: The select module contains the epoll functionality.
    Line 13: Since sockets are blocking by default, this is necessary to use non-blocking (asynchronous) mode.
    

      

    import socket, select
    
    EOL1 = b'
    
    '
    EOL2 = b'
    
    '
    response  = b'HTTP/1.0 200 OK
    Date: Mon, 1 Jan 1996 01:01:01 GMT
    '
    response += b'Content-Type: text/plain
    Content-Length: 13
    
    '
    response += b'Hello, world!'
    
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    serversocket.bind(('0.0.0.0', 8080))
    serversocket.listen(1)
    serversocket.setblocking(0)
    
    epoll = select.epoll()
    epoll.register(serversocket.fileno(), select.EPOLLIN)
    
    try:
       connections = {}; requests = {}; responses = {}
       while True:
          events = epoll.poll(1)
          for fileno, event in events:
             if fileno == serversocket.fileno():
                connection, address = serversocket.accept()
                connection.setblocking(0)
                epoll.register(connection.fileno(), select.EPOLLIN)
                connections[connection.fileno()] = connection
                requests[connection.fileno()] = b''
                responses[connection.fileno()] = response
             elif event & select.EPOLLIN:
                requests[fileno] += connections[fileno].recv(1024)
                if EOL1 in requests[fileno] or EOL2 in requests[fileno]:
                   epoll.modify(fileno, select.EPOLLOUT)
                   print('-'*40 + '
    ' + requests[fileno].decode()[:-2])
             elif event & select.EPOLLOUT:
                byteswritten = connections[fileno].send(responses[fileno])
                responses[fileno] = responses[fileno][byteswritten:]
                if len(responses[fileno]) == 0:
                   epoll.modify(fileno, 0)
                   connections[fileno].shutdown(socket.SHUT_RDWR)
             elif event & select.EPOLLHUP:
                epoll.unregister(fileno)
                connections[fileno].close()
                del connections[fileno]
    finally:
       epoll.unregister(serversocket.fileno())
       epoll.close()
       serversocket.close()
    

      

    epoll的register

     |  register(...)
     |      register(fd[, eventmask]) -> None
     |      
     |      Registers a new fd or modifies an already registered fd.
     |      fd is the target file descriptor of the operation.
     |      events is a bit set composed of the various EPOLL constants; the default
     |      is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.
     |      
     |      The epoll interface supports all file descriptors that support poll.
    

      

    Epoll的eventmask

    http://man7.org/linux/man-pages/man2/poll.2.html

                  POLLIN There is data to read.
    
                  POLLPRI
                         There is urgent data to read (e.g., out-of-band data on
                         TCP socket; pseudoterminal master in packet mode has
                         seen state change in slave).
    
                  POLLOUT
                         Writing is now possible, though a write larger that the
                         available space in a socket or pipe will still block
                         (unless O_NONBLOCK is set).
    
                  POLLRDHUP (since Linux 2.6.17)
                         Stream socket peer closed connection, or shut down
                         writing half of connection.  The _GNU_SOURCE feature
                         test macro must be defined (before including any header
                         files) in order to obtain this definition.
    
                  POLLERR
                         Error condition (output only).
    
                  POLLHUP
                         Hang up (output only).
    
                  POLLNVAL
                         Invalid request: fd not open (output only).
    

      

    边缘触发(Edge Trigger)和条件触发(Level Trigger)

       边缘触发 是指每当状态变化时发生一个io事件;

       条件触发 是只要满足条件就发生一个io事件;

    http://www.slideshare.net/llj098/epoll-from-the-kernel-side

  • 相关阅读:
    sharepoint2010无法连接到配置数据库。
    多选框加和单选框一样的控制,只能选一个
    Windows Server 2008 网站访问PHP响应慢的解决方法
    Windows下的PHP安装文件线程安全和非线程安全的区别
    Apache+PHP 环境上传文件配置
    出现 HTTP Error 503. The service is unavailable 错误
    IIS7 上传 下载文件大小限制的设置
    php 错误信息配置
    新篇章
    面向对象
  • 原文地址:https://www.cnblogs.com/gsblog/p/4181876.html
Copyright © 2011-2022 走看看