Python中的线程占用太多CPU

时间:2013-10-25 21:28:20

标签: python multithreading io tkinter python-multithreading

我写了一个聊天程序,并使用Tkinter运行了一个GUI,并且去检查新消息何时到达,我创建了一个新线程,以便Tkinter在新线程进入并抓住我的时候不断锁定需要并更新Tkinter窗口。然而,这会变成一个巨大的CPU占用,而我的猜测是,它必须以某种方式完成线程启动并且在函数完成时从未真正释放的事实。

这是相关的代码(它很丑陋而且目前还没有优化,但它完成了工作,并且本身并没有使用太多的处理能力,因为当我运行它没有线程时,它不占用太多的CPU但它锁定了Tkinter)

def interim(self):
    threading.Thread(target=self.readLog).start()
    self.after(5000,self.interim)

def readLog(self):
    print 'reading'
    try:
        length = len(str(self.readNumber))
        f = open('chatlog'+str(myport),'r')
        temp = f.readline().replace('\n','')
        while (temp[:length] != str(self.readNumber)) or temp[0] == '<':
            temp = f.readline().replace('\n','')
        while temp:
            if temp[0] != '<':
                self.updateChat(temp[length:])
                self.readNumber +=1
            else:
                self.updateChat(temp)
            temp = f.readline().replace('\n','')
        f.close()
    except: pass

有没有办法更好地管理线程,所以我不消费&gt; 100%的CPU非常快?

2 个答案:

答案 0 :(得分:2)

看起来你每五秒钟就会创建一个新线程。如果您正在调用的函数超过五秒钟,这些线程将开始堆叠在您身上。也许一个解决方案是不会每五秒生成一个新线程,但是等待第一个线程完成,然后等待五秒钟以产生另一个线程。

真的没有理由一遍又一遍地阅读同一个文件,有吗?为什么不一次读完一遍,并将你在内存中读到的内容保留下来。然后,当您在五秒钟内再次读取它时,您可以跳过已经读过的所有字节(通过seek()),然后只读取添加的新数据。有了它,你甚至不需要使用线程。

看起来你正在做的工作比你需要的更多,当你看起来真正想做的就是模仿'tail -f'。

答案 1 :(得分:0)

如果没有可以运行的代码,很难找到假设的性能/线程问题。

你确定它的线程会吸收掉所有的cpu吗?对我来说似乎很奇怪。如果你替换

threading.Thread(target=self.readLog).start()

self.readLog()

它使用更少的CPU吗?

如果您经常检查新消息,那么线程的创建可能会有问题,我建议您只使用一个带循环的线程来检查具有一些等待/休眠队列/信号的新消息触发新的循环。