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

13

我有一个使用Python和C++代码的GNU Radio应用程序。我希望能够向C++代码发送事件信号。如果它们处于相同的范围内,我通常会使用简单的布尔值,但是代码分离到需要某种形式的共享内存。考虑到代码性能至关重要,因此需要一种高效的方法。

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

明确一下,我需要从Python设置一个标志,C++代码将仅检查此标志,并且如果已设置则进入忙循环。

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

谢谢!


你在使用共享内存方法时会遇到的主要问题是一个程序看到了另一个程序写入的值。由于内存访问语义的限制,C++ 代码可能需要相当长的时间才能看到 Python 代码在某个地方插入到内存中的值。 - Omnifarious
5个回答

12
假设这是一台机器上的两个不同应用程序,而且您需要良好的实时性能,则不建议使用sockets。我会在共享内存中使用标志,并可能使用信号量来确保两个程序不能同时访问该标志。该库提供了Python对信号量和共享内存的访问,并支持Python版本2.4-3.1(不支持3.0):http://semanchuk.com/philip/posix_ipc 编辑:更改建议以使用保护共享内存中标志的信号量。

5
为什么不打开Unix套接字?或者使用DBus?

我只在一些简单的C程序中使用过基本的共享内存,但是为什么要使用套接字/DBus来代替共享内存呢?此外,套接字似乎可能会过度杀伤。共享内存不是更容易吗? - Mr. Shickadance
1
@Shickadance - 通常这会导致更简单的语义。基于消息的通信往往具有良好的可扩展性。此外,由此产生的代码往往更具可移植性(因为共享内存代码可能因操作系统而异)。 - luis.espinal
你可以简单地监听一个打开的套接字,以便在线路上听取任何噪音并享受IPC。 - Jakob Bowyer

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

Boost.Ipc有Python绑定吗?我该如何在Python中使用Boost.Ipc? - Gustavo Muenz
1
@EdisonGustavoMuenz - 我怀疑boost.ipc没有Python绑定。您需要使用C++作为中介。 - Ferruccio

1

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


1

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

如果你有严格的响应时间要求,可能需要超越你的应用程序代码,进入一些支持实时信号的操作系统(rt-linux、muOs等)。


1
可以通过使用 ctypes 进行混合编程来实现,但代价比较高。http://stackoverflow.com/a/1822807/418374 不过不确定其安全性。 - Cong Ma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接