Почему select.select () работает с файлами на диске, а не с epoll ()? - PullRequest
7 голосов
/ 27 декабря 2011

Следующий код представляет собой файл с 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 

I 'Мы также читали, что epoll не поддерживает дисковые файлы - или, возможно, это не имеет смысла.

Epoll для обычных файлов

Но почему select ()поддержка файлов диска тогда?Я посмотрел на реализацию в selectmodule.c, и она, кажется, просто проходит через операционную систему, то есть Python не добавляет никакой специальной поддержки.

На более высоком уровне я экспериментирую с лучшим способомобслуживать статические файлы на неблокирующем сервере.Я предполагаю, что я попытаюсь создать потоки ввода / вывода, которые читают с диска и передают данные в основной поток цикла событий, который пишет в сокеты.

1 Ответ

8 голосов
/ 27 декабря 2011

select позволяет контролировать файловые дескрипторы, указывающие на обычные файлы, однако он всегда будет сообщать о файле как о доступном для чтения / записи (т. Е. Он несколько бесполезен, так как не сообщает, будет ли на самом деле чтение / запись блокироваться). *

epoll просто запрещает мониторинг обычных файлов, так как у него нет механизма (по крайней мере, для Linux), позволяющего определить, будет ли чтение / запись обычного файла блокировать

...