Как реализовать отправку сгенерированных данных постоянно работающим процессом?
Реализую http-сервер, для управления роботом на основе малины. Идея такая - сервер стоящий на малине в начале своей работы создает процессы, который будут работать постоянно и выполнять основные функции робота(взять видеопоток с вебкамеры, управление элементами робота через ком порты и тд). Смысл в том, что такой способ, по идее, должен давать повышенную производительность, т.к не нужно тратить время на создание процесса, запуск интерпретаторов и тд. Проблема в том, что я не могу придумать решение, как обращаться к сгенерированным этими процессами данным. В обычном простеньком сервере, на каждый запрос создается новый процесс, который генерирует данные, тут же процессы уже созданы. В с++, насколько я знаю, нет возможности создать буфер с именем в ходе работы программы. Следовательно мы не можем обратиться к буферу, в которым хранятся данные, сгенерированные этим процессом.
Иными словами.Процессы должны работать всегда, не зависимо от того, есть запросы на генерируемые ими данные или нет. Данные генерируемые процессами должны складываться в какой то буфер, из которого уже будут браться ответы на запросы от пользователей. Эти процессы не должны быть статическими, я хочу добавлять их в зависимости от конфигурации, по этому я не могу сделать статический буфер с именем.
Вопрос в том, как сделать так, чтоб когда нам приходит запрос на данные, сгенерированные процессом, мы могли бы обратиться к ним и вернуть клиенту?
Ответы (1 шт):
Ну так вы же сами уже расписали всю архитектуру
Данные генерируемые процессами должны складываться в какой то буффер, из которого уже будут браться ответы на запросы от пользователей.
Вопрос в том, как сделать так, чтоб когда нам приходит запрос, на данные сгенерированные пермонентным процессом, мы могли бы обратиться к ним и вернуть клиенту?
Вам нужен еще один элемент под названием "менеджер буферов". Его функционал простой
- Каждый процесс по старту создает буфер под свои данные и регистрирует его в менеджере. Скажем передает некий собственный идентификатор (имя этого буфера), указатель на буфер и длину.
- Клиент, подключаясь к системе обращается к этому менеджеру и просит вернуть ему буфер для указанного идентификатора
- В зависимости от того был ли зарегистрирован буфер с этим идентификатором клиент получает указатель на него или null
- Далее клиент напрямую работает с буфером процесса
- При окончании процесса буфер разрегистрируется в менеджере
Добавить синхронизацию менеджера и буферов для многопоточной работы и все готово