pyinotify 中断 check_events

1 投票
1 回答
1186 浏览
提问于 2025-04-17 09:14

我知道 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

虽然多个线程可以同时运行,但每个线程都有自己独立的执行流程。一个线程不能通过调用另一个线程的方法(比如调用 stopIt)来干扰或控制另一个线程的执行。

那我们还能做些什么呢?除了使用超时这个明显的选择外,你还可以让另一个线程创建一个虚拟文件,比如说,这个文件会触发一个 IN_CREATE 事件,然后 MyProcessing 就可以处理这个事件。

我看到 MyProcessing(self) 知道 self,所以它可以设置 self.done = True,(这里的 self 是指 threading.Thread 的实例,而不是 MyProcessing 的实例。)然后 MyProcessing 可以删除这个虚拟文件。

这样你就可以使用

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

来在不设置超时的情况下跳出检查。

撰写回答