在显示时间时缓慢增加tkinter的CPU负载

时间:2017-09-21 15:29:32

标签: python time tkinter cpu-usage can-bus

运行以下代码(从1修改)

import tkinter as tk
import time
import os

class App():
    def __init__(self):
    self.root = tk.Tk()
    self.label = tk.Label(text="")
    self.label.pack()
    self.update_clock()
    self.root.mainloop()

def update_clock(self):
    now = time.strftime("%H:%M:%S")
    self.label.configure(text=now)
    print(now)
    print (os.times())
    self.root.after(1000, self.update_clock)

app=App()

随着时间的推移略微增加CPU负载。在下面的例子中,在1分钟内从0.1到0.2

17:15:49
nt.times_result(user=0.0780005, system=**0.1092007**, children_user=0.0, children_system=0.0, elapsed=0.0)

17:16:49
nt.times_result(user=0.0780005, system=**0.2184014**, children_user=0.0, children_system=0.0, elapsed=0.0)

从长远来看,这会阻碍一切。

如何克服这种行为?
有没有更好的解决方案在tkinter“永远”显示时钟?

1 个答案:

答案 0 :(得分:0)

根据documentation

os.times()

返回一个5元组的浮点数,表示累计(处理器或其他)时间,以秒为单位。这些项目包括:用户时间,系统时间,孩子的用户时间,孩子的系统时间,以及自上一个固定点以来经过的实际时间。请参阅Unix手册页时间(2)或相应的Windows Platform API文档。在Windows上,只填充前两个项目,其他项目为零。

元组中的第二个浮点是system time并且根据this page system time == clock_t tms_stime

tms_stime字段包含代表调用进程执行任务时在系统中花费的CPU时间。

根据系统时间的WIKI,python返回的值是在μs中测量的。 1 μs == One millionth of one second

所以这些数字即使它们正在增长也不应该真正影响系统性能。

此外,Windows可能会根据WIKI返回1 ms100 ns个值。 1 ns == One billionth of one second 1 ms = One thousandth of one second。也是数字太小而无法真正发挥作用。

更新:

经过一些测试后,我发现每个操作system time的增加都发生在更新tkinter小部件上。我确实尝试了标签和输入字段。我确实确认system time显示的值是处理该方法所花费的时间。我测试了打印os.times()只是为了查看system time是否与更新标签具有相同的增长而不是。

我会继续寻找能找到的东西。

我认为如果在函数的每个循环上调用相同数量的代码行,则应记录相同数量的处理时间。可能由于系统响应时间而略有变化,但我不应该看到这个响应时间的缓慢而持续的增长。

只有在更新tkinter小部件(例如EntryLabelText时才会发生接缝。当我将这些值打印到控制台时,system time永远不会上升。