在Python多处理中使用共享值/数组与队列/管道的优缺点

2024-03-29 09:06:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在过去的几天里,我一直在慢慢地学习使用Python中的多处理库,我已经到了一个地步,我问自己这个问题,但我找不到答案

我知道答案可能因应用程序而异,因此我将解释我的应用程序是什么

我在我的主进程中创建了一个调度程序,它控制多个进程何时执行(这些进程在较早的时候生成,在调度程序在共享值中发出标志时连续循环并执行代码)。使用调度器中的计数器,我可以让多个进程以不同的频率(在100-400Hz范围内)执行代码,并且它们都是完全同步的

例如,一个进程以400 Hz的频率执行四旋翼机(ode)的动态模型,并更新四旋翼机的状态。我的其他进程(命令生成和轨迹生成)以较低的频率(200 Hz和100 Hz)运行,但需要更新的状态。我目前看到两种方法:

  • 使用管道:这需要为动力学/控制和动力学/轨迹连接使用单独的管道。此外,我需要控制和轨迹过程来使用最新计算的四架直升机的状态,因此我需要冲洗管道,直到管道中的最后一个值。这个可以用,但看起来不太干净

  • 使用共享值/数组:我只需要状态的一个数组,我的动态进程将向其中写入,而我的其他进程将从中读取。我可能需要实现锁(我是否可以在没有锁的情况下同时从两个进程读取共享值/数组?)。这还没有经过测试,但可能会更干净

我已经读到过,过多地使用共享内存是一种不好的做法(为什么?)。是的,我会在400赫兹时更新它,在200和100赫兹时读取它,但它不会是这么大的阵列(10个浮点或双倍)。然而,我也读到共享内存比管道/队列更快,如果使用共享内存不是太大的问题,我想在代码中优先考虑速度

请注意,我必须将生成的命令发送到我的动态进程(另外5个ish浮点),并将生成的所需状态发送到我的控制进程(另外10个ish浮点),因此这要么是更多共享数组,要么是更多管道

所以我想知道,对于我的应用,两种方法的优缺点是什么。谢谢


Tags: 答案代码程序应用程序管道进程状态轨迹