Python - 等待没有高CPU使用率的条件

时间:2015-01-18 13:24:18

标签: python cpu wait

在这种情况下,说我想等待条件发生,这可能发生在任何随机时间。

 while True:
    if condition:
        #Do Whatever
    else:
        pass

如您所见,传递将在条件为True之前发生。但是当条件不是真时,cpu被挂起通过导致更高的CPU使用率,当我只是想让它等到条件发生时。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

请参阅Busy_loop#Busy-waiting_alternatives

  

大多数操作系统和线程库提供各种系统调用,可阻止事件处理,例如锁定获取,定时器更改,I / O可用性或信号。

基本上,等待某事,你有两个选择(与IRL相同):

  • 以合理的间隔定期检查(这称为"轮询")
  • 让您等待的事件通知您:以某种方式调用(或者,作为一种特殊情况,取消阻止)您的代码(这称为"事件处理"或"通知&# 34;。对于阻止的系统调用,"阻止呼叫"或"通常使用同步呼叫"或特定于呼叫的条款)

答案 1 :(得分:2)

正如已经提到的,你可以a)轮询,即检查条件,如果不是真的等待一段时间间隔,如果你的条件是外部事件,你可以安排阻塞等待状态改变,或者你还可以查看发布订阅模型pubsub,其中您的代码注册了对给定项目的兴趣,然后代码的其他部分发布该项目。

答案 2 :(得分:-1)

这不是一个Python问题。最理想的情况是,您希望将进程置于休眠状态并等待操作发生的某种信号,等待时不使用CPU。因此,编写Python代码的情况并非如此,而是要弄清楚使用什么机制使condition为真,从而等待它。

如果条件是由程序中的另一个线程而不是外部资源设置的简单标志,则需要返回并从头开始学习线程的工作原理。

只有当你等待的东西没有提供你可以等待的任何类型的推送通知时,你才应该考虑在循环中轮询它。 sleep将有助于减少CPU负载,但不会消除它,并且还会增加响应延迟,因为睡眠必须在您开始处理之前完成。

至于等待事件,事件驱动的范例可能是你想要的,除非你的程序是完全无关紧要的。 Python有Twisted框架。