如何避免忙于等待没有阻塞调用的代码?

时间:2015-10-25 13:34:56

标签: python

在编写while True循环时避免大量CPU使用的最佳方法是什么?在某些情况下这些循环无效?好像time.sleep(0)会伤害CPU:

import time

msg = []

# in main thread I will add messages to msg list sometimes
msg.append('some_msg')

# in some other thread I will parse them like this:
while True:
  for msg in msgs:
    # do some operations
  time.sleep(0) # hurt CPU in case of len(msg) == 0

是的,我可以使用time.sleep(1)而不是它,但它是否真的是在Python中执行它的最正确方法?

2 个答案:

答案 0 :(得分:1)

它只是一个经典的生产者消费者问题,你必须寻求比你更好的实施。

在您的情况下,如果您使用sleep的正值,那么您已经为其他进程节省了CPU以使用它,因为高CPU使用率是好的(为清楚起见,请参阅底部的注释)。 / p>

如果您正在寻找优化和更好的性能,那么您需要根据应用需求调整代码,这里有两个建议。

  1. 如果可以将msg转换为线程安全队列,则可以使用wait and notify调用在线程中使用信令(也称为线程间通信);这样你就可以克服任意等待。

  2. 如果您对msg项目(在for循环中执行)的处理是IO饥饿,那么您可以尝试拆分独立线程,或者您可以升级代码来执行{{ 3}}处理。

  3. 注意:如果您的CPU使用率很高,那么这意味着您最好使用您的计算资源,但这可能会导致可靠性下降而导致资源缺乏,而其他进程可能会出现问题,因此请优先考虑线程/流程根据您的需要而定。

答案 1 :(得分:0)

您使用的是错误的数据类型。列表不用于线程间通信。使用队列。 get - 方法正在阻止。