Я довольно новичок в boost:asio
и хочу выполнить большое количество "параллельных" boost::beast::http
запросов (веб-сервис), распределяя работу между пулами потоков. Я проверил документацию и выполнил первый тест с использованием асинхронных вызовов.
Я набросал только то, что я делаю, потому что проблема скорее концептуальная, а не кодирование:
boost::thread_group worker_threads;
for (int x = 0; x < 1; ++x)
{
worker_threads.create_thread(boost::bind(&WorkerThread, io_context_p));
}
...
...
...
std::shared_ptr<restservices::RestAsyncSession> session_sp(new restservices::RestAsyncSession(*io_context_p, "127.0.0.1", "8090"));
auto x = std::bind(&restservices::RestAsyncSession::doRequestAsync,...)
io_context_p->post(x);
...
...
...
Я думаю, boost::asio
- это правильный выбор, и в принципе он работает, как и ожидалось. Но недостатком является то, что адресная служба отдыха может принимать только ограниченное количество соединений (скажем, 200). Поэтому через некоторое время в соединениях отказывают. Поэтому мне нужен какой-то механизм, чтобы отслеживать фактическое количество соединений и разрешать новые запросы только при наличии ресурсов. Использование семафора не кажется хорошей идеей, потому что оно блокирует и, следовательно, противодействует идее boost::asio
. Есть ли поддержка пула подключений? Должен ли я использовать keepalive? В настоящий момент я создаю новый сокет и http::request
каждый раз - я думаю, что это не правильный путь ...
Так что я думаю, что может быть правильным решением для этого. Я думаю, что есть хорошая практика для решения этой проблемы, но я просто не знаю ...