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

时间:2018-06-27 13:24:22

标签: python multithreading multiprocessing robotics

我有一个机器人项目,基本上是一个路径跟踪问题。 在PC中,参考生成算法在Python3.65中实现。该算法将获取室内GPS数据,并使用这些不断更新的数据来计算机器人汽车的参考路径。当然,该算法在 为True时:    .... 框架。 仅当采样频率很高(例如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()分开?我尝试了多线程,但没有用。

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

2 个答案:

答案 0 :(得分:1)

您不需要利用多个cpu内核,只需要等待作为串行端口...您的CPU将处于空闲状态,等待。 。产生新的线程/进程只是等待是浪费...

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

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

这些异步框架允许您注册事件并在事件完成时自动调用函数,全部在单个线程/进程中

它们还允许您在所需的时间安排事件。

答案 1 :(得分:1)

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

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