2017-01-15 2 views
1

Я строю простой сервер C++, где я получаю изображение через запрос POST, отправляю его на графический процессор для обработки, и как только у меня есть результаты с графического процессора, отправьте ответ.Усиление boost :: asio :: coroutine до завершения задачи

Чтобы иметь возможность обрабатывать множество одновременных подключений (и чтобы узнать что-то новое), я использую Boost :: asio, следуя примеру server4 (link), который использует boost :: asio :: coroutine. Проблема, с которой я сталкиваюсь, заключается в том, как отправлять данные из сопрограммы на графический процессор, не блокируя сопрограмму.

GPU является наиболее эффективным, когда он может обрабатывать пакет запросов вместе. Но даже обработка одного запроса по времени (не может быть переключена в контекст как CPU и память IO является узким местом), он должен обработать полный запрос, прежде чем начинать с следующего. Это означает, что мне нужно очереди запросов от сопрограмм и как-то сигнализировать сопрограмму, когда обработка GPU завершена.

Посмотрел через boost :: asio reference, но ничего не выпрыгивает на меня. В общем, как следует форматировать asio сопрограммы, когда ответ не может быть сгенерирован немедленно (например, может потребоваться ~ 500 мс). Как это обычно делается?

ответ

0

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

Поток gpu может быть установлен в режим ожидания до тех пор, пока работа не станет доступной с использованием condition variable и с сетевым кодом вызывать notify_one() после того, как он нажал запрос на работу.

0

Еще один трюк, который работает точно так же, как вы описываете, - установить таймер с предельным сроком, который вы ожидаете в короне (урожай).

Затем из задачи GPU вы отменяете время завершения работы, возобновляя корону.

Смотрите, например

+0

Является ли это для stackful или Stackless сопрограммам? –

+0

Это для асинхронных операций. Каким бы способом вы их не отправляли/не заполняли. – sehe

Смежные вопросы