Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to communicate between C++ server app and django web app

I have some framework doing specific task in C++ and a django-based web app. The idea is to launch this framework, receive some data from it, send some data or request and check it's status in some period.

I'm looking for the best way of communication. Both apps run on the same server. I was wondering if a json server in C++ is a good idea. Django would send a request to this server, and server would parse it, and delegate a worker thread to complete the task. Almost all data that need to be send is string-like. Other data will be stored in database so there is no problem with that.

Is JSON a good idea? Maybe you know some better mechanism for local communication between C++ and django?

like image 247
eclipse Avatar asked Jan 16 '23 17:01

eclipse


2 Answers

If your requirement is guaranteed to always have the C++ application on the same machine as the Django web application, include the C++ code by converting it into a shared library and wrapping python around it. Just like this Calling C/C++ from python?

JSON and other serializations make sense if you are going to do remote calls and the code needs to communicate across machines.

like image 131
Pratik Mandrekar Avatar answered Jan 19 '23 00:01

Pratik Mandrekar


JSON seems like a fair enough choice for data serialization - it's good at handling strings and there's existing libraries for encoding/decoding JSON in both python & C++.

However, I think your bigger problem is likely to be the transport protocol that you use for transferring JSON between your client and server. Here's some options:

You could build an HTTP server into your C++ application (which I think might be what you mean by "JSON server" in your question), which would work fine, though might be a bit of a pain to implement unless you get a hold of a library to handle the hard work for you.

Another option might be to use the 0MQ library to send JSON (or otherwise) messages between your client and server. I think this would probably be a lot easier than implementing a full HTTP server, and 0MQ has some interprocess communication code that would likely be a lot faster than sending things over the network.

A third option would just be to run your C++ as a standalone application and pass the data in to it via stdin or command line parameters. This is probably the simplest way to do things, though may not be the most flexble. If you were to go this way, you might be better off just building a Python/C++ binding as suggested by ablm.

Alternatively you could attempt to build some sort of job queue based on redis or something other database system. The idea being that your django application puts some JSON describing the job into the job queue, and then the C++ application could periodically poll the queue, and use a seperate redis entry to pass the results back to the client. This could have the advantage that you could reasonably easily have several "workers" reading from the job queue with minimal effort.

There's almost definitely some other ways to go about it, but those are the ones that immediately spring to mind.

like image 28
obmarg Avatar answered Jan 18 '23 23:01

obmarg