Как я могу наблюдать за изменениями файловой системы без существенного влияния на производительность системы? - PullRequest
3 голосов
/ 02 декабря 2011

Время для другого вопроса новичка, я боюсь.Я пытаюсь использовать Python 3.2.2 (в данном случае важна версия) для отслеживания изменений в конкретном пути Windows.Простейший метод и метод, который я использую, это:

original_state = os.listdir(path_string)

while os.listdir(path_string) == original_state:
    time.sleep(1)

change_time = datetime.datetime.now()

Я пишу этот код, чтобы выполнить некоторые тесты синхронизации другого приложения.С этой целью скрипт Python должен (а) не оказывать негативного влияния на производительность системы и (б) быть относительно точным - предел ошибки в +/- 1 секунда является абсолютным максимумом, который я могу оправдать.К сожалению, этот метод не соответствует первому критерию: при выполнении этого конкретного кода виртуальная среда забивается , что резко замедляет операции, производительность которых я пытаюсь точно измерить.

Я прочитал , как посмотреть файловую систему на предмет изменений , Как посмотреть файл на наличие изменений? и http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html (статья рекомендуется какрешение этого второго вопроса SO.) К сожалению, код Тима Голдена выглядит как код Python 2.x - насколько я могу судить, модуль pywin32 не поддерживается в Python 3.

Что я могу сделать в Python 3, чтобы отслеживать этот конкретный путь, не сталкиваясь с теми же проблемами с производительностью?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Согласно документации ActivePython 3.2 , их pywin32 теперь поддерживает Python 3.x

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

В Linux есть iNotify и pyNotify.Аналогичным механизмом асинхронного уведомления в Windows является функция FindFirstChangeNotification , являющаяся частью FileSystemWatcher Class

Посмотрите решения на странице Тима Голдена:

0 голосов
/ 25 марта 2013

Можно также отслеживать файл или каталог, используя GFileMonitor , при этом Gio заботится о деталях базовой операционной системы. Хотя, конечно, вы не будете использовать Gtk, если это программа для Windows. Для потомков:

from gi.repository import Gio

gfile = Gio.file_new_for_path('/home/user/Downloads')
gfilemonitor = gfile.monitor(Gio.FileMonitorFlags.NONE, None)
gfilemonitor.connect('changed', callback_func)
...