我是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
下载它答案 0 :(得分:1)
如果您正在使用“标准”python实现(又名cpython),您应该知道Global Interpreter Lock。我引用(强调我的):
在CPython中,全局解释器锁或GIL是一个互斥锁,它可以防止多个本机线程一次执行Python字节码。这种锁是必要的,主要是因为CPython的内存管理不是线程安全的。 (但是,由于存在GIL,其他功能已经增长,取决于它所强制执行的保证。)
可能的替代方法是使用multiprocessing模块实际使用不同的进程。但在这种情况下,您必须明确地将数据发送到其他进程,因为它们不共享地址空间。建议在初始化GUI之前启动其他进程。
关于像Tk这样的GUI工具包,要记住的另一点是,它通常只允许从原始线程进行Tk调用。
大多数GUI工具包都有超时或空闲功能,可以在GUI没有执行任何操作时执行小任务。您可以构建应用程序以使用它们。