2010-02-21 2 views
0

Модуль pyfsevents позволяет программам Python использовать инфраструктуру Mac OS X FSEvents. Можно зарегистрировать путь и функцию обратного вызова, а затем вызвать функцию listen(), которая блокирует до тех пор, пока событие с файловой системой не произойдет в зарегистрированном пути.Threading and pyfsevents

pyfsevents.registerpath("/example", callback) 
    pyfsevents.listen() 

Я хотел бы использовать этот модуль в многопоточной программе, имеющий одну блокировки потоков и ожидании событий файловой системы, а затем уведомление другого потока для обработки события. К сожалению, похоже, что listen() блокирует всю программу, а не только вызывающий поток. Может ли кто-нибудь подтвердить это? Есть ли способ заблокировать только вызывающий поток? Если нет, существуют ли способы достижения аналогичной функциональности, то есть, если поток обнаруживает изменения в каталоге, предпочтительно без опроса?

ответ

1

Да, как the docs говорит (в разделе "Ограничений"),

Резьбонарезного небезопасный: CFRunLoop-х и Python потоков не совсем хорошо взаимодействуют , когда вместе взятые :)

Я рекомендуется использовать multiprocessing, чтобы изолировать использование pyfsevents в специальном процессе, который может отправлять предупреждающие сообщения «хедз-ап» основному процессу любым способом (например, через multiprocessing.Queue).

Если вам нужно запустить на Python 2.5, есть backport модуля multiprocessing - последний в стандартной библиотеке только с Python 2.6, но backport отлично работает на 2,4 и 2,5.