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()

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

请指教

4

2 回答 2

14

如果您知道下一次运行的时间,您可以简单地使用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()来唤醒您的线程。

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

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

于 2012-02-19T13:35:56.947 回答
2

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

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

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

于 2012-02-19T13:39:46.483 回答