Почему select.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 для обычных файлов

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

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

7
задан Community 23 May 2017 в 12:21
поделиться