31

我正在尝试使用 Pyserial 通过串行设备与设备通信。由于需要不断发送命令,因此必须将它们放在 Python 中的 while 循环中。

我目前正在使用此代码,并查看了python 进程占用 100% CPU

while True:
    #do some serial sending here
    time.sleep(0.2)

此代码有效。但是,发送速度很慢。我试图通过减少间隔来使其更快sleep,但它似乎有点过多地加载 CPU。

简而言之,有没有什么方法可以有效地永远迭代 while 循环,同时仍然保持 CPU 资源的低消耗?

4

3 回答 3

62

缓慢的 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 停止了每个 while 循环。

于 2012-06-07T06:33:30.363 回答
7

关于您对 Joachim 回答的评论:

然后您的微控制器代码需要重新设计。否则你只是把你的通用计算机变成了一个愚蠢的“微控制器”,它反复迭代不需要的代码,因此是 100% cpu。错误使用计算机的另一个症状是硬件电机的速度取决于您通过串行接口向其发送命令的速度。您需要使用将托管您的高级逻辑的计算机“命令”它。您的微控制器需要处理电机的低级重复控制。

于 2012-08-27T18:48:55.930 回答
3

您必须弄清楚您愿意在速度和 CPU 负载之间进行权衡。

如果您必须发送短时间的数据,而在消息之间没有做太多的事情,那么也许您可以在短时间内忍受高 CPU 负载,因为平均值可能仍然很低。

于 2012-06-07T05:59:36.253 回答