Python中的线程占用了太多的CPU

2024-05-16 01:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: selfreadlinetkinterdefcpu线程lengthtemp
2条回答

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

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

看起来你做的工作比你需要的多得多,而你真正想做的只是模仿“尾巴-f”。在

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

你确定是线程占用了所有的cpu吗?我觉得很奇怪。如果你替换

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

^{pr2}$

它使用更少的CPU吗?在

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

相关问题 更多 >