Why does select.select() work with disk files but not epoll()?

99封情书 提交于 2019-12-29 06:57:25

问题


The following code essentially cats a file with 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)

When I try a similar thing with epoll I get an error:

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

I've also read that epoll does not support disk files -- or perhaps that it doesn't make sense.

Epoll on regular files

But why does select() support disk files then? I looked at the implementation in selectmodule.c and it seems to just be going through to the operating system, i.e. Python is not adding any special support.

On a higher level I'm experimenting with the best way to serve static files in a nonblocking server. I guess I will try creating I/O threads that read from disk and feed data to the main event loop thread that writes to sockets.


回答1:


select allows filedescriptors pointing to regular files to be monitored, however it will always report a file as readable/writable (i.e. it's somewhat useless, as it doesn't tell you whether a read/write would actually block).

epoll just disallows monitoring of regular files, as it has no mechanism (on linux at least) available to tell whether reading/writing a regular file would block



来源:https://stackoverflow.com/questions/8645721/why-does-select-select-work-with-disk-files-but-not-epoll

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!