Связь между приложениями, написанными на разных языках - PullRequest
3 голосов
/ 03 декабря 2010

Я смотрю на связывание нескольких приложений вместе (все написаны на разных языках, таких как C #, C ++, Python), и я не уверен, как это сделать.

Что я имею в виду, связывая?Система, над которой я работаю, состоит из небольших программ, каждая из которых отвечает за определенную задачу обработки.Мне нужно иметь возможность легко переносить набор данных из одного приложения в другое (рассматриваемый набор данных невелик, возможно, несколько мегабайт), а также мне нужен какой-то способ контроля текущего состояния операции (этогде модель клиент-сервер звонит в колокольчик)

Вроде бы сокеты или, может быть, SOAP был бы универсальным решением, но он просто хотел узнать мнение людей по этому вопросу.

Комментарии / предложения будут оценены, спасибо!

Ответы [ 6 ]

2 голосов
/ 03 декабря 2010

Мне лично нравится: ØMQ . Это библиотека, которая имеет знакомый BSD-подобный интерфейс для передачи сообщений, но вы обнаружите, что она реализует интересные шаблоны для распределения задач.

Похоже, вы хотите организовать несколько процессов в конвейере. ØMQ позволяет вам делать это, используя push и poll сокеты. (И после этого вы обнаружите, что можно даже без особых усилий масштабировать несколько процессов и машин.) Для начала посмотрите руководство и zmq_socket (3) man-страница специально для того, как работают push и pull.

Привязки доступны для всех языков, которые вы упоминаете.

Что касается содержания сообщения, ØMQ не заботится об этом, это всего лишь блоки необработанных данных. Вы можете использовать любой формат, который вам подходит, например, JSON, или, возможно, Протокол буфера .

В чем я не уверен, так это «контролирующее состояние», о котором вы упомянули. Вы заинтересованы, например, в отмене работы на полпути?

1 голос
/ 03 декабря 2010

Для C # - C # вы можете использовать Windows Communication Foundation .Вы также можете использовать его с Python и C ++.

Вы также можете извлекать именованные каналы.

0 голосов
/ 03 декабря 2010

Существует много способов межпроцессного взаимодействия. Как вы сказали, сокеты могут быть универсальным решением. Мыло, я думаю, является излишним. Вы также можете использовать почтовые ящики. Я написал приложение на C ++, используя его пару лет назад. Именованные каналы также могут быть решением, но если вы кодируете в Windows, это может быть сложно.

На мой взгляд:

  1. Головки
  2. 1008 * почтовые слоты *

являются лучшими кандидатами.

0 голосов
/ 03 декабря 2010

Мне нужно иметь возможность легко переносить набор данных из одного приложения в другое (рассматриваемый набор данных невелик, вероятно, несколько мегабайт)

Использовать файловую систему.

и мне также нужен какой-то способ управления текущим состоянием операции

Опять же, используйте файловую систему. Файл "current_state.json" с сериализованным объектом JSON идеально подходит для работы с несколькими языками.

Вроде бы сокеты или, может быть, SOAP был бы универсальным решением.

Возможно. Но это излишне для такого рода вещей. Ваша ОС уже имеет все необходимые вам средства. Просто используйте файловую систему. Это очень просто и очень надежно.

0 голосов
/ 03 декабря 2010

Большинству сторонних программ сложно связываться с кодом C ++ из-за алгоритма искажения имен, который он использует для своих символов.По этой причине при взаимодействии с программами, написанными на других языках, часто лучше объявить оболочки как extern "C" или внутри блока extern "C" {.

0 голосов
/ 03 декабря 2010

Я бы подумал о переходе на модель, в которой вы устраните проблему, имея централизованные данные, на которые смотрят все приложения. Держите, так сказать, «один источник истины».

...