Как сделать асинхронное чтение / запись веб-сокетов Beast наряду с чтением / записью файлов?

У меня есть программа на C++, которая разветвляется на два процесса: 1 (оригинал) и 2 (разветвленный процесс).

В разветвленном процессе (2) он выполняет программу A, которая выполняет много вычислений.

Исходный процесс (1) связывается с этой программой A через стандартный ввод и вывод, перенаправленный на каналы.

Я пытаюсь добавить соединение websocket с моим кодом в исходном процессе (1). Я хотел бы, чтобы мой исходный процесс эффективно выбирал или использовал, есть ли данные, которые нужно прочитать из канала в программу А, или есть данные, которые нужно прочитать из соединения через веб-сокет.

Учитывая, что веб-сокет зверя не является файловым дескриптором, как я могу сделать эффект select или epoll?

2 ответа

Решение

Какую версию Boost вы используете? Если это сравнительно недавно, он должен включать поддержку boost::process::async_pipe, которая позволяет асинхронно использовать объекты ввода / вывода с сокетами с Asio. Примеры приведены в руководствах для библиотеки boost:: process. Поскольку Beast использует библиотеку Asio для выполнения операций ввода-вывода, вы можете легко объединить их.

Учитывая, что веб-сокет зверя не является файловым дескриптором...

Beast WebSocket не является файловым дескриптором, но он использует TCP-сокеты для выполнения операций ввода-вывода (см. Связанные примеры выше), и Asio очень хорошо использует select/epoll с TCP-сокетами. Просто убедитесь, что вы делаете async_read, async_write а также io_service::run операции как обычно.

Вы можете внести небольшие изменения в свой код. Заменить трубу двумя Message Queue, Например out_q а также response_q, Теперь ваш дочерний процесс A будет постоянно читать out_q и всякий раз, когда ваш основной процесс отправить сообщение out_q ваш основной процесс не будет ждать какого-либо ответа от ребенка, и ваш ребенок будет использовать это сообщение. Связь через очередь сообщений является асинхронной. Но если вам все еще нужен такой ответ, как любое сообщение об успехе или неудаче от ребенка, вы можете получить его через response_q который будет прочитан вашим родительским процессом. Чтобы узнать ответ дочернего элемента на конкретное сообщение, первоначально отправленное родителем, вы можете использовать идентификатор корреляции. (Читайте немного о корреляции id). Теперь в родительском процессе реализуем два 2 потока, один будет непрерывно читать на веб-вызов, а другой - на стандартный ввод. И один метод (возможно, статический), который будет связан с out_q бросить сообщение. Используйте мьютекс, чтобы только один поток мог вызвать его и отправить сообщение out_q, Ваш основной поток или процесс будет читать response_q, Таким образом, вы можете сделать все параллельно и асинхронно. Если вы не хотите использовать поток, у вас есть опция для fork() и создания двух дочерних процессов для одного и того же. Надеюсь, что это поможет вам.

Другие вопросы по тегам