2017-02-23 64 views
0

我正在使用「Inotify」記錄在目錄(此處爲tmp)中創建文件或文件夾時的事件。這裏的例子在串行過程中完成了這項工作。意思是,所有文件的創建都是依次處理的。在創建文件的情況下併發事件通知

import logging 

import inotify.adapters 

_DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' 

_LOGGER = logging.getLogger(__name__) 

def _configure_logging(): 
    _LOGGER.setLevel(logging.DEBUG) 

    ch = logging.StreamHandler() 

    formatter = logging.Formatter(_DEFAULT_LOG_FORMAT) 
    ch.setFormatter(formatter) 

    _LOGGER.addHandler(ch) 

def _main(): 
    i = inotify.adapters.Inotify() 

    i.add_watch(b'/tmp') 

    try: 
     for event in i.event_gen(): 
      if event is not None: 
       (header, type_names, watch_path, filename) = event 
       _LOGGER.info("WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s " 
          "WATCH-PATH=[%s] FILENAME=[%s]", 
          header.wd, header.mask, header.cookie, header.len, type_names, 
          watch_path.decode('utf-8'), filename.decode('utf-8')) 
    finally: 
     i.remove_watch(b'/tmp') 

if __name__ == '__main__': 
    _configure_logging() 
    _main() 

我想向大家介紹了事件的通知的並行化的幾個文件的情況下通過導入線程上傳,我應該添加一個線程的循環?第二個問題,我不確定它會把線程功能放在哪裏。

回答

-1

以下腳本在多次會話的情況下處理多個事件。所以在我的情況下,這就夠了。我添加了多處理選項而不是線程。我發現多線程處理速度比線程速度快。

import logging 
import threading 
import inotify.adapters 
import multiprocessing 

_DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' 

_LOGGER = logging.getLogger(__name__) 

def _configure_logging(): 
    _LOGGER.setLevel(logging.DEBUG) 

    ch = logging.StreamHandler() 

    formatter = logging.Formatter(_DEFAULT_LOG_FORMAT) 
    ch.setFormatter(formatter) 

    _LOGGER.addHandler(ch) 



def PopUpMessage (event): 
    if event is not None: 
     (header, type_names, watch_path, filename) = event 
     _LOGGER.info("WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s " 
      "WATCH-PATH=[%s] FILENAME=[%s]", 
      header.wd, header.mask, header.cookie, header.len, type_names, 
      watch_path.decode('utf-8'), filename.decode('utf-8')) 


def My_main(count): 
    i = inotify.adapters.Inotify() 
    DirWatcher=i.add_watch(b'/PARA') 
    try: 
     while True: 
      for event in i.event_gen(): 
       m = multiprocessing.Process(target=PopUpMessage, args=(event,)) 
       m.start()    

    finally: 
     i.remove_watch(b'/PARA') 

if __name__ == '__main__': 
    _configure_logging() 
    N = multiprocessing.Process(target=My_main) 
    N.start() 
相關問題