select.select () с обычными файлами - PullRequest
2 голосов
/ 31 января 2011

Кто-нибудь знает, работает ли select.select () с обычными файлами или только с сокетами / каналами?

Я пробовал на Solaris, Linux и Mac OS X - он не блокируется при вызове select.select ().

Это просто взрывает мой мозг, пытаясь что-то подобное без удачи

import os
import select

fds = [ os.open("read.txt", os.O_RDONLY) ]

while True:
    reads, _, _ = select.select(fds, [], [], 2.0)
    if 0 < len(reads):
        print "-> ",os.read(reads[0], 10)
    else:
        print "timeout"

Ответы [ 3 ]

2 голосов
/ 31 января 2011

Из документации :

Обратите внимание, что в Windows это работает только для розеток; на другой операционной системы, это также работает для другого файла типы (в частности, на Unix, это работает на трубах). Это не может быть использовано на обычные файлы, чтобы определить, является ли файл увеличился с момента последнего чтения.

Это помогает?

1 голос
/ 28 декабря 2011

Я только что столкнулся с этой же проблемой:

Почему select.select () работает с файлами на диске, но не с epoll ()?

Ответ заключается в том, что он на самом деле не работает, потому что любой метод неблокирующего ввода-вывода в ядре не поддерживает файлы на диске. Просто select () возвращает «True», а затем читает () блоки, как вы нашли. Да, Unix непоследователен и плохо понят!

1 голос
/ 31 января 2011

select должно работать и для файлов, но я думаю, что FD для файлов всегда будет готов.

Вы также должны проверить, достигли ли вы конца файла.Вот пример, который работает для меня:

import os
import select

fds = [ os.open("data", os.O_RDONLY) ]

while True:
    reads, _, _ = select.select(fds, [], [], 2.0)
    if 0 < len(reads):
        d = os.read(reads[0], 10)
        if d:
            print "-> ", d
        else:
            break
    else:
        print "timeout"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...