Простой, но быстрый метод IPC для приложений на Python и C ++? - PullRequest
10 голосов
/ 22 апреля 2011

У меня есть приложение GNU Radio, которое использует код Python и C ++. Я хочу иметь возможность сигнализировать код C ++ о событии. Если бы они находились в одной и той же области видимости, я бы обычно использовал простое логическое значение, но код был бы отдельным до точки, где требуется некоторая форма разделяемой памяти. Данный код критичен по производительности, поэтому требуется эффективный метод.

Сначала я думал о сегменте разделяемой памяти, который доступен как для Python, так и для C ++. Поэтому я мог бы установить флаг в коде Python и проверить его из C ++. Поскольку мне нужен простой флаг для приостановки кода C ++, будет ли достаточно семафора?

Чтобы было ясно, мне нужно установить флаг из Python, и код C ++ просто проверит этот флаг, и если он установлен, введите занятый цикл.

Итак, будет ли разумным подход к реализации сегмента разделяемой памяти между Python / C ++? Как насчет семафора? В Linux что проще реализовать?

Спасибо!

Ответы [ 5 ]

9 голосов
/ 22 апреля 2011

Предполагая, что это два отдельных приложения на одной машине, и вам нужна приличная производительность в реальном времени, которую вы не хотите использовать с сокетами. Я бы использовал флаг в разделяемой памяти и, вероятно, использовал бы семафор, чтобы убедиться, что обе программы не могут получить доступ к флагу сразу. Эта библиотека обеспечивает доступ к семафорам и разделяемой памяти с Python и поддерживает версии Python 2.4-3.1 (не 3.0): http://semanchuk.com/philip/posix_ipc

РЕДАКТИРОВАТЬ: изменена рекомендация использовать семафор для защиты флага в общей памяти

5 голосов
/ 22 апреля 2011

Почему бы не открыть сокет Unix?Или используйте DBus

3 голосов
/ 22 апреля 2011

Если опция Boost является опцией, вы можете использовать Boost.Python и Boost.Interprocess . Boost.Python предоставляет способ взаимодействия объектов Python и C ++, а Boost.Interprocess предоставляет множество опций для совместной памяти или примитивов синхронизации через границы процесса.

1 голос
/ 22 апреля 2011

Вы можете попробовать использовать пользовательские сигналы. Я не знаю, что код Python может отправлять пользовательские сигналы, но ваш C / C ++ может определенно определять пользовательские сигналы с помощью SIGIO.

Если у вас строгие требования ко времени отклика, вам может потребоваться заглянуть за пределы кода вашего приложения и на некоторое время ОС с поддержкой сигналов реального времени (rt-linux, muOs и т. Д.)

1 голос
/ 22 апреля 2011

DBus выглядит многообещающе. Он поддерживает сигналы, поэтому вы сможете остановить приложение по требованию. Тем не менее, я не уверен, что его производительности будет достаточно для вас.

...