Следующий код, по сути, кошки файл с 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 не поддерживает дисковые файлы - или, возможно, не делает смысл.
Но почему тогда select () поддерживает дисковые файлы? Я посмотрел на реализацию в selectmodule.c, и, похоже, она просто переходит в операционную систему, т.е. Python не добавляет никакой специальной поддержки.
На более высоком уровне я экспериментирую с лучшим способом обслуживания статических файлов на неблокирующем сервере. Думаю, я попытаюсь создать потоки ввода-вывода, которые читают с диска и передают данные в основной поток цикла событий, который записывает в сокеты.