Как работает опрос файла на наличие изменений? - PullRequest
6 голосов
/ 24 января 2011

Проблема

Я ожидал, что приведенный ниже скрипт напечатает не более одного события, а затем остановится (он написан только для иллюстрации проблемы).

#!/usr/bin/env python

from select import poll, POLLIN

filename = "test.tmp"

# make sure file exists
open(filename, "a").close()

file = open(filename, "r+")

p = poll()
p.register(file.fileno(), POLLIN)

while True:
    events = p.poll(100)
    for e in events:
        print e
        # Read data, so that the event goes away?
        file.read()

Однако он печатает около 70000событий в секунду.Почему?

Фон

Я написал класс, который внутренне использует класс pyudev.Monitor .Помимо всего прочего, он опрашивает fileno, предоставленный методом fileno (), на предмет изменений, используя объект опроса .

Теперь я пытаюсь написать модульный тест для своего класса (я понимаю,Я должен сначала написать модульный тест, поэтому нет необходимости указывать его), и поэтому мне нужно написать собственный метод fileno () для моего фиктивного объекта pyudev.Monitor, и мне нужно управлять им, чтобы я могвызвать объект опроса, чтобы сообщить о событии.Как показывает приведенный выше код, я не могу заставить его прекратить сообщать о, казалось бы, несуществующих событиях!

Я не могу найти в классе опроса нетcknowledge_event () или чего-либо подобного, чтобы убрать событие (я подозреваю, чтоодно событие, которое как-то застряло), поиск в Google, и этот сайт ничего не дал.Я использую Python 2.6.6 на Ubuntu 10.10.

1 Ответ

4 голосов
/ 24 января 2011

Вам больше повезет, если вы будете использовать трубы, а не файлы. Попробуйте вместо этого:

#!/usr/bin/env python
import os
from   select import poll, POLLIN

r_fd, w_fd = os.pipe()

p = poll()
p.register(r_fd, POLLIN)

os.write(w_fd, 'X') # Put something in the pipe so p.poll() will return

while True:
    events = p.poll(100)
    for e in events:
        print e
        os.read(r_fd, 1)

Это распечатает единственное событие, которое вы ищете. Чтобы вызвать событие опроса, все, что вам нужно сделать, это записать байт в дескриптор файла для записи.

...