【问题标题】:python process takes 100% CPUpython进程占用100% CPU
【发布时间】:2012-03-10 02:41:47
【问题描述】:

我正在尝试运行 python 应用程序并根据指定的时间间隔执行操作。下面的代码不断消耗 100% 的 CPU。

def action_print():

    print "hello there"

interval = 5
next_run = 0

while True:

    while next_run > time.time():
        pass

    next_run = time.time() + interval

    action_print()

我想避免让进程进入睡眠状态,因为在不同的时间间隔会有更多的动作要执行。

请指教

【问题讨论】:

  • 如果你不想以一种或另一种方式睡觉,你会烧毁 CPU。
  • 您能否详细说明“将在不同的时间间隔执行更多操作”?
  • 如何确保在进程休眠时所有内容都按时执行?我尝试使用睡眠,但是任何不到一秒的东西都会占用 CPU。
  • 你想让这个进程占用 100% cpu 吗?
  • @larsmans - 我的意思是更多的动作即将到来,而不仅仅是打印。整个问题在于浮动间隔,即 3.5s、4.73s 等。

标签: python cpu consumption


【解决方案1】:

如果您知道下一次运行的时间,您可以简单地使用time.sleep

import time
interval = 5
next_run = 0
while True:
   time.sleep(max(0, next_run - time.time()))

   next_run = time.time() + interval
   action_print()

如果您希望其他线程能够打断您,请使用 event,如下所示:

import time,threading
interval = 5
next_run = 0
interruptEvent = threading.Event()
while True:
   interruptEvent.wait(max(0, next_run - time.time()))
   interruptEvent.clear()

   next_run = time.time() + interval
   action_print()

另一个线程现在可以调用interruptEvent.set() 来唤醒你的。

在许多情况下,您还希望在共享数据上使用Lock 来避免race conditions。确保在保持锁定时清除事件。

您还应该知道,在 cpython 下,只有一个线程可以执行 Python 代码。因此,如果您的程序在多个线程上受 CPU 限制,并且您使用的是 cpython 或 pypy,则应将 threading 替换为 multiprocessing

【讨论】:

    【解决方案2】:

    大概你不想写 time.sleep(interval) ,但是用 time.sleep(0.1) 替换 'pass' 将几乎完全释放你的 CPU,并且仍然让你在 WHILE 谓词中具有灵活性。

    或者,您可以为正在安排的每个事件使用一个线程并使用 time.sleep(interval) 但这仍然会占用您的 CPU。

    底线:您的循环 WHILE :PASS 非常快速地循环使用所有 CPU。

    【讨论】:

    • 我的 OSX 机器上的一个进程正在运行,而 True:time.sleep(0.1) 在顶部显示为 0.0% cpu 使用率。
    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多