Python模块变量作为中心存储,用于在线程内进行数据共享和访问

时间:2016-06-13 07:33:08

标签: python multithreading algorithm ros

在我目前的算法中,我正在与机器人进行一些交互。机器人正在运行ROS主机,它会发布所有数据本身。运行算法的计算机连接到ROS主站并控制机器人。

算法的计算基于机器人的当前状态(将通过ROS发布)。对于这种情况,必须始终具有机器人的当前状态。然而,同时,我的算法需要不断地根据当前机器人状态做出决策。因为我需要并行完成一些工作,所以我考虑过使用线程。

我的想法是以下

我有一个中央存储(基本上是一个python模块)" vars",它只包含不同类型的变量,其中包括当前的机器人状态。我的想法是,从ROS更新这些变量,所以我总是在这些变量中有最新数据,我可以根据这个中央存储变量进行计算。

我的问题

  • 您如何看待我的基本结构?
  • 在线程中使用python模块变量是否安全?



感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

您应该能够像您建议的那样构建系统。只要它很小,你就不应该有任何问题,但是你应该重新考虑一下你是否想要在更大的环境中运行或长时间运行的东西。

我在设计中看到的主要问题是:

  • 杂波。总有一个变量没有一个好名字,你想在两个模块中使用它。在此设置中,它最终会出现在vars模块中,使其难以理解。
  • 所有权。在此设置中,任何模块都可以更改任何变量。如果你需要调试,那么很难弄清楚是谁做了改变以及为什么。
  • 难以测试。当你编写测试时(你可能应该写一些)然后你需要设置整个大模块,这可能会变得棘手。

作为改进,我建议不要存储值,存储拥有它们的类并对它们负责。如果接口更容易,您可以提取接口,但您始终知道哪个模块负责什么。当添加具有不完美名称的奇怪变量时,这也有帮助,因为至少你有模块名称可以为你提供一些暗示。

对于测试,如果您不接受整个模块,只会获取所需的数据,这会有所帮助。您可以使用一个小的包装器来获取模块,提取所需的值并将它们传递给更多可测试的方法。

还要处理python(GIL)中的全局解释器锁。您可能无法获得预期的并行性。

同样,当你有一个更大的设置或你想要保持更长时间的设置时,这一切都是有意义的。对于原型和实验,您提出的设置应该可以正常工作。

相关问题