-1

私はPythonを初めて使用し、明日までにプロジェクトを提出しようとしています。私はPythonを使用してubuntuのログ監視システムを開発しています。ログ分析用のクラスを設計しました。ここで、一度に1つ以上のログを監視するために、2つのスレッドを呼び出し、クラスの2つのインスタンスを呼び出します。

最初にコードを実行すると、両方のスレッドが実行されます。しかし、後でスレッド2のみが実行されます。スレッド1はそうではありません。

それを修正するためにどこで変更を加える必要があるか教えてください。または、他のマルチスレッドシステムを提案します。関数のリンク参照を入れてください。勉強する時間があまりありません。小さなコード修正は非常に役立ちます。

 def start_thread(): 
  last_time=strftime("%Y-%m-%d %H:%M:%S", gmtime())
  global CheckVar1
  global CheckVar9
  CheckVar1 = 1
  CheckVar9 = 1
  mylist.insert(END,last_time+"            LOG MONITORING ACTIVATED.")
  #lock=thread.allocate_lock()

  thread.start_new_thread(_thread,("Thread No:1",1))
  thread.start_new_thread(_thread1,("Thread No:2",8))

 #------------------------------
 def _thread(string2,sleeptime,*args):
  #lock.acquire() 
  lineCount=0;
  check=0;
  print string2
  #mylist.insert(END,"checking,,,")
  #time.sleep(sleeptime);
  logic()

 def _thread1(string3,sleeptime2,*args):
  #lock.acquire() 
  lineCount=0;
  check=0;
  print string3
  #mylist.insert(END,"checking,,,")
  #time.sleep(sleeptime2);
  logic1()



 btn_start = Button(app, text = "GO >>")
 btn_start.grid(row=3,column=1,sticky=W);
 btn_start["command"]=start_thread



 class LogWatcher(object):
    def __init__(self, log_file_name, callback):
    self.log_file_name = log_file_name
    self.callback = callback
    global count_number_of_line
    print log_file_name
    self.initial_counting(log_file_name)



    def looping(self, waiting_time=5):
    while 1:
        self.check_change(self.log_file_name, count_number_of_line)
        print count_number_of_line
        time.sleep(waiting_time)




    def initial_counting(self, log_file_name):
    .....



    def check_change(self, log_file_name, last_count):
    .......



 def logic():    
        .....

    m=LogWatcher("/var/log/auth.log", callback)
    m.looping()

 def logic1():    

    ...
    l=LogWatcher("/var/log/kern.log", callback2)
    l.looping()

ここに完全なコードを入れませんでした。しかし、誰かがそれを実行したい場合は、ここからダウンロードできます

4

1 に答える 1

1

「標準」のPython実装(別名cpython)を使用している場合は、グローバルインタープリターロックに注意する必要があります。私は引用します(私の強調):

CPythonでは、グローバルインタープリターロック(GIL)は、複数のネイティブスレッドがPythonバイトコードを一度に実行するのを防ぐミューテックスです。このロックが必要なのは、主にCPythonのメモリ管理がスレッドセーフではないためです。(ただし、GILが存在するため、他の機能は、GILが適用する保証に依存するようになりました。)

考えられる代替案は、マルチプロセッシングモジュールを使用して実際に異なるプロセスを使用することです。ただし、その場合、他のプロセスはアドレススペースを共有しないため、データを明示的に他のプロセスに送信する必要があります。GUIを初期化する前に、他のプロセスを起動することをお勧めします。

TkのようなGUIツールキットに関して覚えておくべきもう1つのポイントは、通常、元のスレッドからのみTk呼び出しを行うことが許可されているということです。

ほとんどのGUIツールキットにはタイムアウトまたはアイドル機能があり、GUIが何もしていないときに小さなタスクを実行できます。それらを使用するようにアプリを構成できます。

于 2012-12-23T21:12:35.800 に答える