Python和C ++应用程序的简单但快速的IPC方法?

时间:2011-04-22 15:11:57

标签: c++ python linux ipc

我有一个GNU Radio应用程序,它使用Python和C ++代码。我希望能够发出事件的C ++代码信号。如果它们在相同的范围内,我通常会使用一个简单的布尔值,但代码与需要某种形式的共享内存的点是分开的。有问题的代码对性能至关重要,因此需要一种有效的方法。

我最初考虑的是Python和C ++都可以访问的共享内存段。因此,我可以在python代码中设置一个标志,并从C ++中检查它。因为我只需要一个简单的标志来暂停C ++代码,信号量就足够了吗?

要清楚,我需要从Python设置一个标志,C ++代码只会检查这个标志,如果设置了,则输入一个忙循环。

那么尝试在Python / C ++之间实现共享内存段是一种合理的方法吗?信号量怎么样?在Linux上,哪个更容易实现?

谢谢!

5 个答案:

答案 0 :(得分:7)

假设这是一台机器上的两个独立应用程序,并且您需要不错的实时性能,您不希望使用套接字。我会在共享内存中使用一个标志,并且可能使用信号量来确保两个程序不能同时访问该标志。该库提供对Python的信号量和共享内存的访问,并支持Python版本2.4-3.1(而不是3.0):http://semanchuk.com/philip/posix_ipc

编辑:将建议更改为使用保护共享内存中的标志的信号量

答案 1 :(得分:5)

为什么不打开unix socket?或者使用DBus

答案 2 :(得分:3)

如果可以选择Boost,则可以使用Boost.PythonBoost.Interprocess。 Boost.Python为Python提供了一种方法。要进行交互的C ++对象和Boost.Interprocess为跨进程边界的共享内存或同步原语提供了大量选项。

答案 3 :(得分:1)

DBus看起来很有前途。它支持信号,因此您应该能够按需停止应用程序。但是,我不确定它的性能是否足够。

答案 4 :(得分:1)

您可以尝试使用自定义信号。我不知道Python代码能够发送自定义信号,但您的C / C ++当然可以使用SIGIO定义自定义信号。

如果您有严格的响应时间要求,您可能需要超越您的应用程序代码并进入支持实时信号(rt-linux,muOs等)的OS时间