2011-12-27 1 views
6

Следующий код по существу кошкам файл с select.select():Почему select.select() работает с файлами диска, но не epoll()?

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 on regular files

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

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

ответ

7

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

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

+0

Ах ОК, так что мой os.read() вызов в тогда цикл выбора блокируется. имеет смысл. –

+0

@ user1117755 Да, он блокируется, если ему приходится ждать жесткого диска. – nos