Python进程占用100%的CPU

5

我正在尝试运行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()

我希望避免让进程休眠,因为需要在不同的间隔执行更多的操作。
请给予建议。

2
如果你不想睡觉,无论如何,你都会消耗CPU。 - Mat
你能详细说明一下“将会在不同时间间隔执行更多的操作”吗? - Fred Foo
我该如何确保进程在休眠时一切都能按时执行?我尝试使用sleep,但是任何小于一秒的时间都会占用CPU。 - m1k3y3
你想让这个进程占用100%的CPU吗? - lpostula
@m1k3y02:计算需要采取行动的确切时刻,然后睡眠直到那个时间。 - Fred Foo
显示剩余2条评论
2个回答

16

如果您知道下一次运行的时间,可以直接使用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()

如果你希望其他线程能够中断你,请使用这样的事件

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()唤醒你的线程。

在许多情况下,您还需要使用来避免共享数据上的竞争条件。确保在持有锁时清除事件。

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


2

假设您不想编写 time.sleep(interval) ,但是将'pass'替换为 time.sleep(0.1) 将几乎完全释放您的CPU,并仍然允许您在 WHILE 谓词中灵活使用。

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

底线:您的循环 WHILE :PASS 正快速循环,消耗所有CPU。


我的OSX电脑上运行的进程 while True:time.sleep(0.1) 在top命令中显示为0.0%的CPU使用率。 - user1202733

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接