pyinotify прерывание check_events - PullRequest
1 голос
/ 30 декабря 2011

Я знаю, pyinotify.Notifier.check_events(self, timeout=None) может занять тайм-аут, но я бы предпочел, чтобы опрос проводился бесконечно.Возможно ли его прервать?

Я звоню Notifier.stop(self), но, похоже, он не сбегает от check_events.

В следующем примере другой поток вызывает stopIt()и self.notifier.stop() вызывается - но не выводятся ни "check_events is True", ни "check_events is False":

def run(self):
    self.notifier = pyinotify.Notifier(self.monitor, MyProcessing(self))
    while True:
        self.notifier.process_events()
        print "Waiting at check_events"
        if self.notifier.check_events():
            print "check_events is True"
            self.notifier.read_events()
        else:
            print "check_events is False"
    print "Out of while"
    return True

def stopIt(self):
    self.notifier.stop()

1 Ответ

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

Несмотря на то, что потоки выполняются одновременно, каждый поток имеет свой независимый поток выполнения. Один поток не может вводить команды в поток выполнения другого потока, вызывая его методы (например, вызывая stopIt).

Так что еще мы можем сделать? Ну, кроме очевидного варианта использования тайм-аута, вы можете использовать другой поток для создания фиктивного файла, скажем, который запускает событие IN_CREATE, которое затем может обработать MyProcessing.

Я вижу, MyProcessing(self) знает self, поэтому он может установить self.done = True, (где self - это многопоточность. Экземпляр нитей, а не экземпляр MyProcessing.) MyProcessing может затем удалить фиктивный файл. .

Тогда вы могли бы использовать

    if (not self.done) and self.notifier.check_events():
        print "check_events is True"
        self.notifier.read_events()

для выхода из чека без установки времени ожидания.

...