为什么select.select()适用于磁盘文件但不适用于epoll()?

时间:2011-12-27 14:29:14

标签: python unix select epoll

以下代码实际上是使用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 on regular files

但是为什么select()会支持磁盘文件呢?我查看了selectmodule.c中的实现,它似乎只是进入操作系统,即Python没有添加任何特殊支持。

在更高级别上,我正在尝试在非阻塞服务器中提供静态文件的最佳方法。我想我会尝试创建从磁盘读取的I / O线程,并将数据提供给写入套接字的主事件循环线程。

1 个答案:

答案 0 :(得分:8)

select允许监视指向常规文件的文件描述符,但是它总是将文件报告为可读/可写(即它有点无用,因为它不会告诉你读/写是否会实际阻塞)。 p> epoll只是不允许监视常规文件,因为它没有机制(至少在linux上)可以判断读/写常规文件是否会阻塞