【问题标题】:threading in Python taking up too much CPUPython中的线程占用过多的CPU
【发布时间】:2013-11-05 03:41:43
【问题描述】:

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

【问题讨论】:

  • 您的缩进混淆了,这使得无法确定您的代码是如何工作的。
  • 对不起,我刚刚意识到并改变了它。

标签: python multithreading io tkinter python-multithreading


【解决方案1】:

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

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

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

【讨论】:

  • 差不多了,你能解释一下 seek() 函数吗,也许是一个例子?这听起来完全符合我的计划,而且在线程完成后您会将 {after} 命令放在哪里运行?这些都是我想过但不知道怎么做的。
  • 我最终只使用了这个,一开始只使用一个线程来实现这个功能,效果很好。
【解决方案2】:

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

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

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

self.readLog()

它使用更少的 CPU 吗?

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

【讨论】:

  • 是的,它使用较少的 CPU,但 Tkinter 冻结了几秒钟,然后重新开始。
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2012-03-10
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多