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

Python 如何避免忙于等待没有阻塞调用的代码?,python,Python,当编写而True循环在某些情况下无能为力时,避免大量CPU使用的最佳方法是什么?似乎时间。睡眠(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:

当编写
而True
循环在某些情况下无能为力时,避免大量CPU使用的最佳方法是什么?似乎
时间。睡眠(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

是的,我可以用
时间。睡眠(1)
来代替它,但在Python中这真的是最正确的方法吗?

这只是一个典型的生产者-消费者问题,您必须寻找一个比以前更好的实现

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

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

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

  • 如果对
    msg
    项(在
    for
    循环中执行)的处理需要IO,则可以尝试在独立线程中拆分,或者可以升级代码进行处理


  • 注意:如果您的CPU使用率很高,则意味着您最好使用您的计算资源,但这可能会导致可靠性下降,并导致其他进程的资源不足,这可能是不好的,因此请尝试根据您的需要对线程/进程设置优先级。

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

    为什么要这样做?
    时间。睡眠(0)
    在这里没有任何意义,因为它没有做任何有用的事情,它只调用一大堆依赖于平台的代码(因此,浪费资源),仅此而已。指定的链接不包含此问题的任何真正答案,请重新打开我的问题在此上下文中调用sleep()的原因是允许其他线程在消息循环等待消息时运行。您应该将睡眠时间设置为可以接受的值。如果您的应用程序需要在十分之一秒内响应消息,请使用睡眠(0.05)并在等待消息到达时将cpu释放到其他进程。执行此操作的“正确”方式取决于您的
    msgs
    变量实际添加到/删除的内容/方式。当您“处理”了一条消息后,它会被丢弃吗?在我们帮助您之前,您需要提供有关您的具体问题的更多信息。使用sleep进行轮询几乎总是错误的,在这种情况下,这几乎是确定无疑的。由于代码不消耗任何内容,OP明确拒绝澄清,因此没有有效的答案。这就是你遇到的坏问题。(±0)。@msw yes使用sleep进行轮询是一种残忍的方式,但它很简单,而且很多人都在使用它,这就是为什么我建议使用事件循环和线程安全队列的原因。@msw进一步说,正如前面提到的,它是一种非阻塞调用,使用
    事件循环
    并不能提供更好的吞吐量,它只会防止饥饿,我的最佳选择是使用
    wait
    notify
    ,这样当
    msgs
    结束时,CPU可以做得更好。同意。我将把这个答案解读为“如果OP的要求更好,这是异步方法的一个很好的阐述”。