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