Simple CIB entre C++ et Python (multi-plateforme)
J'ai un C++ processus en cours d'exécution en arrière-plan qui sera la génération des "événements" rarement qu'un Python processus en cours d'exécution sur la même case aurez besoin de ramasser.
- Le code sur le côté C doit être aussi léger que possible.
- Le Python côté est en lecture seule.
- La mise en œuvre doit être multi-plateforme.
- Les données envoyées est très simple.
Quelles sont mes options?
Grâce
- Quel OS sont vos programmes en cours d'exécution en vertu de l' ? Pipe en fonction de l'IPC est très facile à mettre en œuvre sous Unix-comme des machines.
- Unix et Windows
- "le côté C" est une faute de frappe, non ?
Vous devez vous connecter pour publier un commentaire.
zeromq - et rien d'autre. coder les messages comme des chaînes de caractères.
Toutefois, Si vous voulez obtenir serialiazation à partir d'une bibliothèque d'utilisation protobuf il va générer des classes pour Python et C++. Vous utilisez le SerializeToString() et ParseFromString fonctions de() à chaque extrémité, et de rediriger les chaînes via ZeroMq.
Problème résolu, comme je doute que toute autre solution est plus rapide, ni toute autre solution aussi facile de fil et simple à comprendre.
Si vous voulez utiliser des primitives du système de rpc tels que les canaux nommés sur Windows et Unix Domain Sockets sous unix, alors vous devriez regarder Boost::ASIO. Cependant, à moins que vous ont (a) un réseau d'arrière-plan, et (b) une très bonne connaissance de C++, ce sera très coûteuse en temps
protobuf
est seulement une solution pour la sérialisation aspect.Google protobuf est une grande bibliothèque pour le RPC entre les programmes. Il génère des liaisons pour Python et C++.
Si vous avez besoin d'un système de messagerie distribué, vous pouvez également utiliser quelque chose comme RabbitMQ, zeromq, ou ActiveMQ. Voir cette question pour une discussion sur le message de la file d'attente des bibliothèques.
protobuf
est juste une bibliothèque de sérialisation pour portable le transport du message lui-même. Il ne semble pas prévoir un mécanisme pour les appels RPC et de l'IPC.Utilisation zeromq, c'est aussi simple que vous pouvez obtenir.
Une autre option est de simplement appeler votre code C à partir de votre code Python à l'aide de la
ctypes
module plutôt que de courir les deux programmes séparément.Quelle est la complexité de vos données? Si c'est simple, je voudrais sérialiser comme une chaîne de caractères. Si c'était moyennement complexe, je voudrais utiliser JSON. TCP est un bon cross-plate-forme de l'IPC de transport. Puisque vous dites que ce CIB est rare que la performance n'est pas très important, et TCP+JSON sera fine.
Vous pouvez utiliser Google GRPC pour cette
Je vais vous dire créer une DLL qui va gérer la communication entre les deux. Le python va charger la DLL et l'appel de méthode getData() et la DLL sera à son tour de communiquer avec des processus et d'obtenir les données.
Qui ne devrait pas être difficile.
Vous pouvez aussi utiliser des fichiers XML de fichier ou de base de données SQLite ou toute base de données pour les données de la requête. Le démon de mise à jour de la DB et Python garder l'interrogation. Il y a peut être déposée pour indiquer si les données en DB est déjà mis à jour par le démon et puis Python requête.
Bien sûr, il dépend de la performance et de la précision des facteurs de!