python - Python快速计算和慢速串行写入:多线程或多进程
问题描述
我有一个机器人项目,基本上是一个路径跟踪问题。在PC中,参考生成算法是在Python3.65中实现的。该算法采用室内 GPS 数据并使用这些不断更新的数据来计算机器人汽车的参考路径。当然,算法在一段 时间内运行 True: .... 框架。该算法只有在采样频率很高的情况下才能正常工作,比如 0.001s。但是,问题是,在计算参考路径后,需要通过 Serial.write() 将路径信息逐字节写入 PC 的串行端口。这个 serial.write() 函数仍然是一个 for 循环。而且这个写入过程非常慢(16个字节超过0.02s)。如果 for 循环包含在 while True: 框架中,类似于:</p>
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,因此无法正确计算 Data。
简而言之,如何将快速计算算法与慢速 serial.wtite() 分开?我尝试了多线程,但不起作用。
任何帮助将不胜感激,非常感谢!
解决方案
您不需要利用多个 cpu 内核,您只需要等待串行端口...您的 CPU 将处于空闲状态,等待...产生新线程/进程以等待是浪费...
这就是为什么你应该尝试使用一些异步 IO 解决方案。
例如,使用https://github.com/pyserial/pyserial-asyncio或https://twistedmatrix.com/documents/16.1.0/api/twisted.internet.serialport.SerialPort.html
这些异步框架允许您注册事件并在它们完成时自动调用您的函数,所有这些都在单个线程/进程中。
它们还允许您在您想要的时间安排活动。
推荐阅读
- javascript - 为什么我的网站(在 Strato 上)无法显示我想用 javascript 设置的背景图片?*(在本地效果很好)*
- r - 为什么R不扫描数据
- ruby-on-rails - 如何使用终端命令在 Ubuntu 18.04 上运行 Ruby on Rails 应用程序
- excel - 根据同一行中的单元格条目预填充下拉列表单元格(Excel/VBA)?
- flutter - 无法在颤振中构建apk --release
- java - 工厂设计模式与OCP(开闭原则)的违反
- mysql - "(" 在此位置无效,需要 EOF,";"
- composer-php - 作曲家,显示建议的包
- android - 我在哪里可以将构建操作设置为“AndroidResource”?
- javascript - 如何在用逗号分隔值的键分隔的数组中排序