我正在尝试使用Pyserial通过串口与设备通信。由于需要不断发送命令,因此必须将它们放在Python中的while循环中。
我目前正在使用此代码,并查看了python process takes 100% CPU:
while True:
#do some serial sending here
time.sleep(0.2)
此代码有效。但是,发送速度很慢。我试图通过减少sleep
间隔来加快速度,但似乎加载了CPU太多。
简而言之,有没有办法永远有效地迭代while循环,同时仍然保持较低的CPU资源消耗?
答案 0 :(得分:53)
慢CPU消耗部分是“执行串行发送”。只有短暂睡眠的while循环将使用可忽略不计的CPU。
可以显示串行发送代码吗?可能有办法加快速度。
在这个相当慢的CPU上我看到了:
import time
while True: time.sleep(0.2) # 0% CPU
while True: time.sleep(0.02) # 0% CPU
while True: time.sleep(0.002) # 0.5% CPU
while True: time.sleep(0.0002) # 6% CPU
while True: time.sleep(0.00002) # 18% CPU
现在在循环中做一些额外的工作:
import time
while True: range(10000) and None; time.sleep(0.2) # 1% CPU
while True: range(10000) and None; time.sleep(0.02) # 15% CPU
while True: range(10000) and None; time.sleep(0.002) # 60% CPU
while True: range(10000) and None; time.sleep(0.0002) # 86% CPU
我在解释器中运行它们并使用ctrl-C停止每个循环。
答案 1 :(得分:5)
关于你对约阿希姆回答的评论:
然后您的微控制器代码需要重新设计。否则你只是把你的通用计算机变成一个愚蠢的“微控制器”,它反复迭代不需要的代码,因此100%的CPU。您错误使用计算机的另一个症状是硬件电机的速度取决于您通过串行接口向其发送命令的速度。您需要使用将托管您的高级逻辑的计算机“命令”它。并且您的微控制器需要处理电机的低级别,重复控制。
答案 2 :(得分:3)
你必须弄清楚你愿意在速度和CPU负载之间进行权衡。
如果你必须发送短时间数据,而不是在消息之间做很多事情,那么你可能会在很短的时间内承受高CPU负载,因为平均值可能仍然很低。