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

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

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

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

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

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

3

Решение

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

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

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

3

Другие решения

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

1

По вопросам рекламы [email protected]