Передача данных из Django в приложение C ++ и обратно - PullRequest
5 голосов
/ 01 сентября 2011

Мы создаем торговое приложение, бэкэнд которого полностью на C ++ (с использованием движка QuickFix).Мы хотели бы создать веб-приложение в Django поверх этого бэкэнда, где пользователь может размещать свои заказы.И приложение Django (python), и приложение C ++ будут работать в своих собственных процессах и адресном пространстве.Как вы думаете, что будет лучшей идеей для передачи заказов / сообщений из Django в C ++?

Кроме того, это торговое приложение, поэтому задержка является самой большой проблемой.Поэтому я не хочу помещать заказы в базу данных из Django, а затем извлекать их из приложения C ++.

В настоящее время я смотрю на это с помощью разделяемой памяти или какого-либо другого механизма IPC.Это хорошая идея?

Ответы [ 4 ]

2 голосов
/ 01 сентября 2011

Ну, вы должны использовать какой-то метод IPC.Одна из тех, о которых вы не упомянули, - это прослушивание сокета процессом C ++.Это добавило бы гибкости (с небольшими затратами на скорость), что процессы даже не должны быть на одной машине.

Я делал нечто похожее, пришёл из C ++, но хотел написать UX на python.Мой вычислительный бэкэнд - C ++, и я скомпилировал модуль python и сгенерировал HTML с флягой для UX.Мой C ++ и python живут в одном и том же процессе, поэтому я пока не рассмотрел ваш ключевой вопрос на практике.

Один совет, который я бы дал, - сохранить все ваши элементы IPC на C ++ и написать небольшоймодуль Python в C ++ с использованием Boost.Python.Это позволит процессу python выполнять 95% работы в мире pythony, но даст вам уверенность на уровне битов, которую я хотел бы использовать в качестве разработчика C ++ для данных, которые вы отправляете в C ++.Boost.Python позволил мне быстро создать мосты для C ++ и веб-фреймворков Python.

1 голос
/ 01 сентября 2011

Я бы использовал zeromq для МПК

1 голос
/ 01 сентября 2011

Вы должны придумать существующий протокол или создать свой собственный протокол, который обеспечит связь между C ++ и Python.Я полагаю, что самый простой способ - использовать IPC, например ZeroC Ice или CORBA .Кроме того, вы можете добавить нативный код C ++ в Python и использовать его из Django, который также может использовать QuickFIX.

И если вы действительно беспокоитесь о задержке (по крайней мере, миллисекунды имеют значение), не говоря уже о наносекундах) - вы вообще не должны использовать QuickFIX или Python.

0 голосов
/ 01 сентября 2011

Я бы, вероятно, выбрал что-то вроде JSON-RPC и обменивался бы данными через локальные сокеты или именованные каналы.

Общая память быстрее, но сложнее разобраться, если вам нужно сделатьэто самостоятельно (это подразумевает параллелизм и блокировку, которых, IMO, следует избегать, если это возможно.)

Это зависит от размеров сообщений и требований к задержке.И вы всегда можете попробовать механизм IPC, который может работать над разделяемой памятью, как упоминает Влад в комментарии ниже.

(Обратите внимание, что наличие системы IPC, которая может использовать каналы / сокеты, может быть хорошимвещь, на случай, если вам понадобится кластеризовать вашу систему в будущем).

...