Межпроцессное взаимодействие в C ++ - PullRequest
2 голосов
/ 28 августа 2009

У меня есть простое приложение на c ++, которое генерирует отчеты на серверной части моего веб-приложения (простая настройка LAMP). Проблема заключается в том, что сервер загружает файл данных, который занимает около 1,5 ГБ в памяти. Это не очень хорошо масштабируется, если несколько пользователей запускают его одновременно, поэтому я думаю разделить на несколько программ:

Программа A - это основной исполняемый файл, который всегда работает на сервере, всегда загружает данные и может фактически запускать отчеты.

Программа B создается из php и делает простой запрос к программе A, чтобы получить необходимую информацию, и возвращает данные.

Итак, мои вопросы таковы: Какой хороший механизм для В, чтобы попросить А что-то сделать? Как это должно работать, когда А не имеет ничего общего? На самом деле я не хочу участвовать в опросах или как-то иначе крутить мои шины.

Ответы [ 3 ]

4 голосов
/ 28 августа 2009

Используйте именованный мьютекс / событие, в основном это позволяет одному потоку (процесс А в вашем случае) сидеть и ждать. Затем приходит процесс B, которому нужно что-то сделать, и сигнализирует мьютекс / событие, которое активирует процесс A, и вы продолжаете.

Если вы в Microsoft:

Мьютекс , Событие

Ipc на Linux работает по-другому, но имеет те же возможности:

Linux Stuff

Или, в качестве альтернативы, для части c ++ вы можете использовать одну из библиотек boost IPC, которые являются мультиплатформенными. Я не уверен, что есть в PHP, но он, несомненно, будет иметь что-то эквивалентное.

2 голосов
/ 28 августа 2009

IPC легко в C ++, просто вызовите POSIX C API.

Но то, что вы спрашиваете, будет гораздо лучше обслуживать администратор очередей. Заставьте фонового демона ждать сообщения в очереди, а внешний интерфейс PHP просто добавит туда спецификации задачи, которую он хочет обработать. Некоторые администраторы очередей допускают добавление результата задачи к тому же объекту, или вы можете определить новую очередь для завершающих сообщений.

Один из самых известных высокопроизводительных администраторов очередей - RabbitMQ . Еще один очень простой в использовании - MemcacheQ .

Или вы можете просто добавить таблицу в MySQL для задач, фоновый процесс периодически запрашивает незавершенные. Это работает и может быть очень надежным (иногда называемым очередями гетто), но ломаться при высоких задачах в секунду.

2 голосов
/ 28 августа 2009

Использовать сокеты TCP, работающие на localhost.

  1. Сделать приложение C ++ демоном.
  2. Интерфейс PHP создает постоянное соединение с демоном. pfsockopen
  3. Когда запрос сделан, PHP отправляет запрос демону, который затем обрабатывает и отправляет все обратно. PHP-сокеты C ++-сокеты

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...