当前位置: 代码迷 >> python >> 如何避免忙于等待没有阻塞调用的代码?
  详细解决方案

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

热度:95   发布时间:2023-06-14 08:50:34.0

在写入while True避免大量CPU使用的最佳方法是什么?在某些情况下无法执行任何操作的while True循环? 好像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中最正确的方法?

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

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

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

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

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

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

您使用的是错误的数据类型。 列表不用于线程间通信。 使用队列。 get -method是阻塞的。

  相关解决方案