Python 快速计算和慢串行写入:多线程或多进程

Python fast calculating and slow Serial writing : Multithread or Multiprocess

我有一个机器人项目,基本上是一个路径跟踪问题。 在PC中,参考生成算法在Python3.65中实现。该算法获取室内 GPS 数据,并使用这些不断更新的数据来计算机器人汽车的参考路径。当然,算法运行在 虽然正确: .... 框架。 该算法只有在采样频率很高时才能很好地工作,比如0.001s。 但是,问题在于,在计算出参考路径后,需要通过Serial.write()逐字节将路径信息写入PC的串口。 这个 serial.write() 函数仍然是一个 for 循环。而且这个写入过程很慢(16字节0.02s以上)。如果for循环包含在while True:框架中,类似于:


while True:
  Data = Ref_generation()
  Bytes_Full = Float_2_Bytes_List(Data)
  for ele in Bytes_Full:
    Serial.write(ele)  # VERY SLOW!!!
  sleep(0.001)

然后,数据无法正确计算,因为循环周期比0.001s长很多。

简而言之,如何将快速计算算法与慢速 serial.wtite() 分开?我尝试了多线程,但没有用。

任何帮助将不胜感激,非常感谢!

你不需要利用多个 cpu 核心,你想要的只是 等待 串口......你的 CPU 会闲着,等待...产生新的threads/processes只是等待是一种浪费...

这就是为什么你应该尝试使用一些异步 IO 解决方案。

示例,使用https://github.com/pyserial/pyserial-asyncio or https://twistedmatrix.com/documents/16.1.0/api/twisted.internet.serialport.SerialPort.html

这些异步框架允许您注册事件并在事件完成时自动调用您的函数,全部在一个 thread/process.

中完成

它们还允许您在您想要的时间安排活动。

我有一个类似的问题,我使用 daemon thread 作为 运行ning 串行通信部分。所以尝试 运行ning 守护进程线程上的串行通信,它将 运行 在主机进程的后台。这将使您的程序能够 运行 执行任务,而与串行通信所需的等待时间无关。这样您就可以将快速计算算法与慢速 serial.wtite().

分开

您可以找到有关守护线程的更多信息 here。为了进一步避免缓冲区滞后,您可以使用 pySerial 中的 reset_output_buffer()