【问题标题】:Simple but fast IPC method for a Python and C++ application?用于 Python 和 C++ 应用程序的简单但快速的 IPC 方法?
【发布时间】:2011-08-11 00:55:54
【问题描述】:

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

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

为了清楚起见,我需要从 Python 设置一个标志,C++ 代码将简单地检查这个标志,如果设置了,则进入一个繁忙的循环。

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

谢谢!

【问题讨论】:

  • 共享内存方法遇到的主要问题是一个程序看到另一个程序写入的值。内存访问语义就是这样,C++ 代码可能需要很长时间才能看到 Python 代码在某处插入内存的值。

标签: c++ python linux ipc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我只在一些简单的 C 程序中使用了基本的共享内存,但是为什么在共享内存上使用 socket/dbus 呢?此外,套接字似乎可能是矫枉过正。共享内存不是更容易吗?
    • @Shickadance - 通常它会导致更简单的语义。基于消息的通信往往可以很好地扩展。此外,生成的代码往往更易于移植(因为共享内存代码可能因操作系统而异。)
    • 您可以简单地听一个打开的插座来了解线路上的任何噪音并享受 IPC
    【解决方案3】:

    如果 Boost 是一个选项,您可以使用 Boost.PythonBoost.Interprocess。 Boost.Python 为您提供了一种与 Python 和 C++ 对象交互的方式,而 Boost.Interprocess 为您提供了许多跨进程边界共享内存或同步原语的选项。

    【讨论】:

    • Boost.Ipc 有 python 绑定吗?我将如何在 python 中使用 Boost.Ipc?
    • @EdisonGustavoMuenz - 我怀疑 boost.ipc 有 python 绑定。您需要使用 C++ 作为中介。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      如果您对响应时间有严格的要求,您可能需要超越您的应用程序代码,并了解一些支持实时信号(rt-linux、muO 等)的操作系统

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2011-11-06
      • 2022-06-17
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多