Simple but fast IPC method for a Python and C++ ap

2020-02-25 08:30发布

I have a GNU Radio application which utilizes both Python and C++ code. I want to be able to signal the C++ code of an event. If they were in the same scope I would normally use a simple boolean, but the code is separate to the point where some form of shared memory is required. The code in question is performance-critical so an efficient method is required.

I was initially thinking about a shared memory segment that is accessible by both Python and C++. Therefore I could set a flag in the python code and check it from C++. Since I just need a simple flag to pause the C++ code, would a semaphore suffice?

To be clear, I need to set a flag from Python and the C++ code will simply check this flag, and if it is set enter a busy loop.

So would trying to implement a shared memory segment between Python/C++ be a reasonable approach? How about a semaphore? On Linux, which is easier to implement?

Thanks!

5条回答
小情绪 Triste *
2楼-- · 2020-02-25 08:51

You can try using custom signals. I don't know about Python code being able to send custom signals, but your C/C++ can certainly define custom signals with SIGIO.

If you have stringent response-time requirements, you might need to look beyond your application code and into some time of OS with support for real-time signals (rt-linux, muOs, etc.)

查看更多
Explosion°爆炸
3楼-- · 2020-02-25 09:00

Why not open a unix socket? Or use DBus

查看更多
ゆ 、 Hurt°
4楼-- · 2020-02-25 09:06

If Boost is an option, you could use Boost.Python and Boost.Interprocess. Boost.Python gives you a way for Python & C++ objects to interact and Boost.Interprocess gives you plenty of options for shared memory or synchronization primitives across process boundaries.

查看更多
smile是对你的礼貌
5楼-- · 2020-02-25 09:11

Assuming this is two separate applications on one machine and you need decent real time performance you don't want to go with sockets. I would use a flag in shared memory, and probably use a semaphore to make sure both programs can't be accessing the flag at once. This library provides access to the semaphores and shared memory with Python and supports Python versions 2.4-3.1 (not 3.0): http://semanchuk.com/philip/posix_ipc

EDIT: Changed recommendation to using a semaphore protecting the flag in shared memory

查看更多
Luminary・发光体
6楼-- · 2020-02-25 09:17

DBus looks promising. It supports signals, so you should be able to stop an application on demand. However, I'm not sure if it's performance will be enough for you.

查看更多
登录 后发表回答