多线程无法在python上运行

时间:2012-12-23 19:23:09

标签: python multithreading

我是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()

我没有把完整的代码放在这里。但如果有人希望它运行,那么您可以从here

下载它

1 个答案:

答案 0 :(得分:1)

如果您正在使用“标准”python实现(又名cpython),您应该知道Global Interpreter Lock。我引用(强调我的):

  

在CPython中,全局解释器锁或GIL是一个互斥锁,它可以防止多个本机线程一次执行Python字节码。这种锁是必要的,主要是因为CPython的内存管理不是线程安全的。 (但是,由于存在GIL,其他功能已经增长,取决于它所强制执行的保证。)

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

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

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