Взаимодействие между приложениями, написанными на разных языках
Я смотрю на связывание нескольких приложений вместе (все они написаны на разных языках, таких как C#, C++, Python), и я не уверен, как это сделать.
Что я подразумеваю под связыванием? Система, над которой я работаю, состоит из небольших программ, каждая из которых отвечает за определенную задачу обработки. Мне нужно иметь возможность легко переносить набор данных из одного приложения в другое (набор данных, о котором идет речь, не огромен, вероятно, несколько мегабайт), а также мне нужен какой-то способ управления текущим состояние операции (это когда модель клиент-сервер звонит в колокол)
Похоже, что сокеты или, может быть, мыло было бы универсальным решением, но просто хотел получить некоторые мнения о том, что люди думают об этом предмете.
Комментарии / предложения будут оценены, спасибо!
6 ответов:
Я лично испытываю симпатию к ØMQ . Это библиотека, которая имеет знакомый интерфейс BSD-сокетов для передачи сообщений, но вы обнаружите, что она реализует интересные шаблоны для распределения задач.
Похоже, что вы хотите организовать несколько процессов в конвейере. ØMQ позволяет сделать это с помощью push и розетки опрос. (А потом вы обнаружите, что можно даже масштабировать несколько процессов и машин без особых усилий.) Взгляните на руководство чтобы начать работу, и zmq_socket(3) man-страницы специально для как толкать и тянуть строительство.
Привязки доступны для всех языков, которые вы упоминаете.
Что касается содержания сообщения, ØMQ не заботится об этом, это просто блоки необработанных данных. Вы можете использовать любой подходящий вам формат, например JSON, или, возможно, буферы протокола .
В чем я не уверен, так это в упомянутом вами "контролирующем состоянии". Вы заинтересованы в том, для например, отменить работу на полпути?
Для C# на C# можно использовать Windows Communication Foundation. Вы можете использовать его также с Python и C++.
Вы также можете проверить именованные каналы.
Я бы подумал о переходе к модели, в которой вы устраняете проблему, имея централизованные данные, на которые смотрят все приложения. Храните ,так сказать," один источник истины".
Большинство внешних программ имеет проблемы с связыванием с кодом C++ из-за алгоритма искажения имен, который он использует для своих символов. По этой причине при взаимодействии с программами, написанными на других языках, часто лучше всего объявлять обертки вещам как
extern "C"
или внутри блокаextern "C" {
.
Мне нужно иметь возможность легко переносить набор данных из одного приложения в другое (набор данных, о котором идет речь, не огромен, вероятно, несколько мегабайт)
Используйте файловую систему.
И мне также нужен какой-то способ контролировать текущее состояние операции
Снова используйте файловую систему. Текущее состояние.файл" json " с сериализованным объектом JSON идеально подходит для работы с несколькими языками.
Похоже на сокеты или возможно, мыло было бы универсальным решением.
Возможно. Но это уже перебор для такого рода вещей. Ваша ОС уже имеет все необходимые средства. Просто используйте файловую систему. Это очень просто и очень надежно.
Существует множество способов межпроцессного взаимодействия. Как вы сказали, сокеты могут быть универсальным решением. Мыло, я думаю, в некотором роде излишество. Вы также можете использовать почтовые слоты. Я написал приложение C++, используя его пару лет назад. Именованные каналы также могут быть решением, но если вы кодируете в Windows, это может быть трудно.
На мой взгляд:
- сокеты
- слоты
- лучшие кандидаты.