Увеличьте Beast WebSockets с несколькими неопределенными записями за чтение

Использование boost / beast websockets в C ++

Я прочитал о проблемах с веб-сокетами beast, не поддерживающими неблокирующее чтение, и о том, что нет способа проверить, доступны ли данные, и что чтение и запись в отдельных потоках, вероятно, не является поточно-ориентированным.

Проблема, которую я имею, выясняет правильный подход к этой проблеме:

API преобразования речи в текст IBM Watson позволяет отправлять фрагменты аудиоданных по мере их появления (или по частям из существующего файла). Однако вы не получите текстовые ответы для каждого фрагмента.

Вместо этого вы продолжаете посылать ему аудиоданные до тех пор, пока он не распознает паузу или конец высказывания, а затем он, наконец, возвращает некоторые результаты.

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

Без неблокирующей функции чтения и без помещения блокирующего чтения в отдельный поток, как мне продолжать отправлять данные, а затем получать результаты только тогда, когда они доступны?

1

Решение

Не путайте отсутствие безопасности потоков с отсутствием полнодуплексных возможностей. Ты можешь позвонить async_read а затем следуйте за ним с призывом async_write, Это приведет к двум «ожидающим» асинхронным операциям. Операция записи завершится вскоре после этого, и операция чтения будет оставаться в ожидании, пока не будет получено сообщение.

Асинхронная модель Асио является «реактивной». Это означает, что ваш обработчик завершения вызывается, когда что-то происходит. Вы не «проверяете, доступны ли данные». Зверь не изобретает колесо здесь, он принимает асинхронную модель Asio. Если вы понимаете, как писать асинхронные сетевые программы с Asio, эти знания перейдут к Beast.

2

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

Других решений пока нет …

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