2016-01-01 13 views
7

私は、特定のファイルリストの変更を監視して対応するマルチスレッドアプリケーションを作成しました。 Watchクラスはファイルサイズを取得し、最初の呼び出し時に変数をsizeに設定します。その後、数秒後に再びファイルのサイズが取得され、以前のサイズと比較され、変更された場合は、sizeがファイルの現在のサイズに設定されます。さらに、threading.ThreadのサブクラスであるWatchWorkerクラスがあります。 Watchクラスを利用するWatchWorkerは、与えられたファイルを '見る'。マルチスレッドアプリケーションのメインスレッドがCtrl + Cに反応しないのはなぜですか?

ここに実際の問題があります。 私が書いたコードは動作しており、変更が検出されたときにユーザーに通知します。しかし、Ctrl + Cを使用してアプリケーションから終了しようとすると応答がありません。私はWindows上にいる。

コード:

import time 
import threading 
import os 

class Watch(object): 
    def __init__(self, path, time=5): 
     self.path = path 
     self.time = time 
     self.size = os.stat(path).st_size 



    def loop(self): 
     while True: 
      time.sleep(self.time) 
      size = os.stat(self.path).st_size 
      if size != self.size: 
       self.size = size 
       print "Change detected in file {}".format(self.path) 



class Watch_Worker(threading.Thread): 
    def __init__(self, path, *args, **kwargs): 
     super(Watch_Worker, self).__init__(*args, **kwargs) 
     self.path = path 


    def run(self): 
     super(Watch_Worker, self).run() 
     Watch(self.path).loop() 

def main(*args): 
    for i in args: 
     thrd = Watch_Worker(path=i) 
     thrd.start() 
     print 'Watching ' + i 
     print "From main thread" 



if __name__ == '__main__': 
    main('blah.js', 'cs.c', 'ab.rb') 

編集

os.stat('somefile.ext').st_size)生成された値を比較するためのコードを変更し。

+2

これはGoogleにとっては珍しいことではありません。回答が必要な場合は、最小限の実例(コード)を提示する必要があります。 – PyNEwbie

+1

すべてのファイルを定期的に読み込むのは、非常にリソースを消費します。最初に修正日を確認するか、特定のファイルシステムウォッチャーを使うべきだと思っています –

+0

@hege_hegedus私は実際にはグラントウォッチのようなものを作ろうとしています。しかし、すぐにファイルの変更時刻を確認するためにコードを更新します。ありがとう:) –

答えて

1

self.daemon = Trueを設定して、メインスレッドが終了できないという問題を解決しました。メインスレッドは、スレッドが終了するのを待機しません。これは、main関数の最後にtime.sleep(5)の無限ループwhileループを追加することによって解決されます。コードは次のとおりです。

class Watch_Worker(threading.Thread): 
     def __init__(self, path, time=2, *args, **kwargs): 
      super(Watch_Worker, self).__init__(*args, **kwargs) 
      self.path = path 
      self.time = time 
      self.size = os.stat(path).st_size 
      self.daemon = True 


     def run(self): 
      super(Watch_Worker, self).run() 
      while True: 
       time.sleep(self.time) 
       size = os.stat(self.path).st_size 
       if size != self.size: 
        self.size = size 
        print "Change detected in file {}".format(self.path) 

    def main(*args): 
     for i in args: 
      thrd = Watch_Worker(path=i) 
      thrd.start() 
      print 'Watching ' + i 
     while True: 
      time.sleep(5) 


    if __name__ == '__main__': 
     main('blah.js', 'cs.c', 'ab.rb') 
関連する問題