2011-12-30 46 views
1

我知道pyinotify.Notifier.check_events(self, timeout=None)可以超時 - 但我寧願它無限期輪詢。是否有可能中斷它?pyinotify中斷check_events

我打電話給Notifier.stop(self),但它似乎並沒有從check_events轉義出來。

在下面的例子中,另一個線程調用stopIt(),並self.notifier.stop()被稱爲 - 但既不「check_events是真」,也不是「check_events是假」印:

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

即使線程併發運行,每個線程有自己獨立的執行流程。一個線程不能通過調用其方法(例如調用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() 

打出來的支票沒有設置超時。

+0

我在想這些方面......但是如果'self.done'被評估並且'check_events'被阻塞 - 如果self.done的值改變了,它會被重新評估嗎? – CrackerJack9 2011-12-31 07:26:34

+0

當另一個線程創建一個虛擬文件時,IN_CREATE事件將取消阻塞'check_events'。因此'self.done'會在循環的下一個循環中被重新評估。 – unutbu 2011-12-31 10:17:31