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

And*_*y C 7 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)
Run Code Online (Sandbox Code Playgroud)

当我用epoll尝试类似的东西时,我收到一个错误:

self._impl.register(fd, events | self.ERROR)
IOError: [Errno 1] Operation not permitted 
Run Code Online (Sandbox Code Playgroud)

我还读过epoll不支持磁盘文件 - 或者说它没有意义.

epoll常规文件

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

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

nos*_*nos 8

select允许监视指向常规文件的文件描述符,但它总是将文件报告为可读/可写(即它有点无用,因为它不会告诉您读/写是否会实际阻塞).

epoll只是不允许监视常规文件,因为它没有机制(至少在linux上)可用来判断读/写常规文件是否会阻塞