【问题标题】:how to solve "when python script is running in background, the time.sleep() performs very bad?"如何解决“当 python 脚本在后台运行时,time.sleep() 执行得非常糟糕?”
【发布时间】:2015-06-03 23:27:28
【问题描述】:

我正在使用 wxpython 和 python 的线程模块来构建一个带有 GUI 的简单计时器。我使用 time.slee(0.5) 来测量时间。问题是:一旦我启动计时器并切换到 chrome 等其他程序。几次之后,当我切换回来时,我的计时器上显示的时间非常不准确。例如,如果我设置 3 分钟运行,结果我的计时器比操作系统时钟慢 3 倍。

经过搜索,我知道 time.sleep() 是不可靠的,但似乎差距如此之大,让我怀疑是否有问题。

我还注意到,如果我不把脚本放到后台,那么只有 2-3 秒的差异。

我可以接受几秒的差异,但不能接受 2“分钟”。我该如何解决?

【问题讨论】:

  • 您可能会发现检查当前时间并将其与预定时间进行比较可能更准确。
  • 如果 Sleep() 时间不可靠,那么您的盒子严重超载或您的设计非常糟糕:(
  • 因为大多数现代桌面/服务器操作系统都有抢先调度程序,您会发现time.sleep() 不能保证非常准确;尤其是与系统上的其他竞争资源。
  • 为避免漂移,请将睡眠与系统时钟同步。您可能应该使用特定于 GUI 的计时器,例如 widget.after() in tkinter or GObject.timeout_add() in Gtk。见code examples in the links

标签: python multithreading timer


【解决方案1】:

sleep() 不保证在给定时间之后进行调度。它只是保证这次至少睡一觉。它可以睡得更久,具体取决于系统负载。

只需从 time.time(或 time.clock,取决于操作系统 - 阅读文档中的注释)与系统时间进行比较。唤醒后使用 sleep() 只是为了不一直占用 CPU。

编辑:

有几种方法可以改善这一点: - 如果您的计时器必须在时间过去后唤醒,您可以简单地 sleep() 直到唤醒前不久,然后忙等待时间完全过去。这将在超时期间阻止 GUI/应用程序。不太好。

  • 您可以在一个线程中使用线程进行显示更新,大约在 ca。 1s(或任何你认为合适的)和另一个线程超时,如上所示。有点复杂。

    • 第三种方法是使用 sleep() 进行 GUI 更新,而无需每秒忙于等待。这会使显示的准确性降低,但 CPU 性能会降低。在时间还没过去之前,您可以忙着等待剩余的时间。

好的,自愿咨询就到此为止了。

【讨论】:

  • 我尝试将 time.sleep() 与“忙等待”甚至纯忙等待结合起来。一旦我启动计时器,它们都会导致 20-25% 的 cpu 使用率。有什么方法可以提高它的性能吗?
  • @Zumars:更好(和正确)的方法可能是使用线程。但是准确性仍然没有提高多少——原因与 sleep() 相同。实际上,这将执行相同的调用。嗯...我今天编辑了我的答案,我的好事。
【解决方案2】:

最后我通过使用 event.wait() 和具有良好分辨率和低 cpu 使用率的多处理模块解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2022-12-22
    • 2023-03-23
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多