简介
python标注库select模块提供了IO多路复用支持,包括select,poll,epoll。当处理大量空闲链接时,epoll能显著提升接口性能。
关于IO多路复用技术,可以参考IO多路复用技术 。
epoll广泛应用于高并发架构中,tornado、eventlet等都支持epoll。
ioloop
ioloop作为tornado四个主要组成部分之一,提供了一个异步网络库。在看过一些tornado源码后发现要实现一个ioloop的核心并不复杂。
#!/usr/bin/env python
# encoding: utf-8
import select
class IOLoop(object):
ERROR = select.EPOLLERR | select.EPOLLHUP
READ = select.EPOLLIN
WRITE = select.EPOLLOUT
def __init__(self):
self.impl = select.epoll()
self._events = {}
self._handlers = {}
def split_fd(self, fd):
try:
return fd.fileno(), fd
except AttributeError:
return fd, fd
def add_handler(self, fd, handler, events):
fd, obj = self.split_fd(fd)
self._handlers[fd] = (obj, handler)
self.impl.register(fd, events | self.ERROR)
def