我正在尝试运行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()
我想避免让进程进入休眠状态,因为会有更多动作以不同的时间间隔执行。
请告知
答案 0 :(得分:13)
如果你知道下一次运行的时间,你可以简单地使用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
。
答案 1 :(得分:2)
大概你不想写time.sleep(interval),但用time.sleep(0.1)代替'pass'几乎可以完全释放你的CPU,并且仍然允许你在WHILE谓词中灵活使用。
或者你可以为你正在安排的每个事件使用一个线程并使用time.sleep(interval)但这仍然会占用你的CPU。
底线:你的循环WHILE:PASS绕着你的所有CPU消耗得非常快。