在编写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中执行它的最正确方法?
答案 0 :(得分:1)
它只是一个经典的生产者消费者问题,你必须寻求比你更好的实施。
在您的情况下,如果您使用sleep
的正值,那么您已经为其他进程节省了CPU以使用它,因为高CPU使用率是好的(为清楚起见,请参阅底部的注释)。 / p>
如果您正在寻找优化和更好的性能,那么您需要根据应用需求调整代码,这里有两个建议。
如果可以将msg
转换为线程安全队列,则可以使用wait and notify调用在线程中使用信令(也称为线程间通信);这样你就可以克服任意等待。
如果您对msg
项目(在for
循环中执行)的处理是IO饥饿,那么您可以尝试拆分独立线程,或者您可以升级代码来执行{{ 3}}处理。
注意:如果您的CPU使用率很高,那么这意味着您最好使用您的计算资源,但这可能会导致可靠性下降而导致资源缺乏,而其他进程可能会出现问题,因此请优先考虑线程/流程根据您的需要而定。
答案 1 :(得分:0)
您使用的是错误的数据类型。列表不用于线程间通信。使用队列。 get
- 方法正在阻止。