下面的代码基本上使用select.select()来获取一个文件:
f = open('node.py') fd = f.fileno() while True: r, w, e = select.select([fd], [], []) print '>', repr(os.read(fd, 10)) time.sleep(1)
当我尝试与epoll类似的事情时,我得到一个错误:
self._impl.register(fd, events | self.ERROR) IOError: [Errno 1] Operation not permitted
我也读过epoll不支持磁盘文件 – 也许这是没有道理的。
普通文件上的Epoll
但为什么select()支持磁盘文件呢? 我查看了selectmodule.c中的实现,似乎只是进入操作系统,即Python没有增加任何特殊的支持。
在更高层次上,我正在尝试在非阻塞服务器中提供静态文件的最佳方式。 我想我会尝试创build从磁盘读取的I / O线程,并将数据提供给写入套接字的主事件循环线程。
选择允许指向常规文件的文件描述符被监视,但是它总是会报告一个文件是可读/可写的(即它没有任何意义,因为它不能告诉你读/写是否会被阻塞)。
epoll只是禁止监视常规文件,因为它没有任何机制(至少在linux上)可用来判断读/写常规文件是否会阻塞