Python 并发 - CAN 总线

Python Concurrency - CAN Bus

我正处于开发基于 CAN 的可扩展硬件测试系统的初期阶段。测试系统的两个主要功能是记录总线上的所有流量并执行测试用例。测试用例将主要由接收和传输 CAN 消息组成,同时评估消息数据有效负载的内容。还将有一系列必须与串行控制设备集成的测试用例。

由于记录所有 CAN 流量的重要性,我一直在考虑基于并发的程序。但我不确定我应该实施哪种形式的并发。我读过 asyncIOthreadingmultiprocessing。所以我对他们每个人都有一个高层次的看法。

我也在使用 python-can 库,它似乎内置了 asyncIO,所以这让我相信 asyncIO 应该没问题。我担心如果测试用例协程的处理速度不够快,我可能必须使用 asyncIO 建立某种缓冲。总线速度500kb。 CAN总线上有2个模块。最高消息频率是 20 毫秒,我认为这足以让 asyncIO 到 运行 2 个协程。我还关心可伸缩性。

我的假设是否正确?使用 asyncIO 应该就好了吗?

非常感谢任何和所有输入。

鉴于您的项目涉及网络和进程间通信,asyncIO 应该是最依赖和大量合并的并发方法。您不太可能需要线程或多处理,除非您在主机之间进行 lot 通信。即便如此,生成进程或线程也会带来显着的开销,如果不小心使用,甚至可能 减慢 执行时间。

我的最终建议是暂时坚持使用 asyncIO,一旦你有了项目的原型,你就可以尝试合并 threading/multiprocessing 并看看你是否注意到加速。 timeit 等模块非常适合此目的。如果您确实选择将线程与 asyncIO 一起使用,那么事件循环中有一些 非常 有用的方法可以与线程很好地交互。参见 link:https://docs.python.org/3/library/asyncio-dev.html#asyncio-multithreading

祝你好运!