2

我编写了一个聊天程序并使用 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

有没有办法更好地管理线程,这样我就不会很快消耗 > 100% 的 CPU?

4

2 回答 2

2

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

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

看起来你做的工作比你需要做的多得多,而你真正想做的只是模仿'tail -f'。

于 2013-10-25T21:46:04.030 回答
0

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

您确定是线程占用了所有 CPU 吗?对我来说似乎很奇怪。如果你替换

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

self.readLog()

它使用更少的CPU吗?

如果你真的经常检查新消息,线程的创建可能是一个问题,我建议你只使用一个带有循环的线程来检查新消息,并使用一些基于等待/睡眠队列/信号的方式来触发一个新的环形。

于 2013-10-25T21:39:32.577 回答