-1

我是 python 新手,明天要提交我的项目。我正在使用 python 为 ubuntu 开发一个日志监控系统。我为日志分析设计了一个类。现在调用两个线程并调用该类的两个实例来一次监控超过 1 个日志。

当我首先运行代码时,两个线程都运行。但后来只有线程 2 运行。线程一不是。

请告诉我应该在哪里进行更改以修复它?或者建议任何其他多线程系统。请放一个函数的链接引用。我没有太多时间研究它。一个小的代码更正将非常有帮助。

 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),您应该了解Global Interpreter Lock。我引用(强调我的):

在 CPython 中,全局解释器锁或 GIL 是一个互斥锁,可防止多个本机线程同时执行 Python 字节码。这个锁是必要的,主要是因为 CPython 的内存管理不是线程安全的。(然而,由于 GIL 的存在,其他功能已经发展到依赖于它强制执行的保证。)

一种可能的替代方法是使用multiprocessing模块实际使用不同的进程。但在这种情况下,您必须明确地将数据发送到其他进程,因为它们不共享地址空间。建议在初始化 GUI 之前启动其他进程。

关于像 Tk 这样的 GUI 工具包要记住的另一点是,它通常只允许从原始线程进行 Tk 调用。

大多数 GUI 工具包都有超时或空闲功能,可让您在 GUI 不执行任何操作时执行小任务。您可以构建您的应用程序以使用它们。

于 2012-12-23T21:12:35.800 回答