Как реализовать несколько асинхронных запросов на сервер?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как реализовать несколько асинхронных запросов на сервер?

Сообщение Anonymous »

Я работаю над приложением, которое связано с API Spotify - он ищет и добавляет треки из файла. Вот моя текущая реализация поиска трека - я ищу по одному треку за раз - сохранение идентификатора, а затем добавляю партию. < /P>
// Parsing traсks from json and get their ids
for(const auto& val : arr){
/* Parsing artist and title*/

auto id = co_await searchTrack(artist.toStdString(), title.toStdString());
if (id.empty()){
continue;
}
trackIds.push_back(id);
if(trackIds.size() == 50){
co_await addTracksToLibrary(trackIds);
trackIds.clear();
}
}

// Send to add-function remained ids
if(!trackIds.empty()){
co_await addTracksToLibrary(trackIds);
trackIds.clear();
}
< /code>
и функция Searchtrack < /p>
boost::asio::awaitable SpotifyClient::searchTrack(
const std::string& artist, const std::string& title){
using namespace boost::asio;
using namespace boost::beast;
try{
/* Make GET path... */

// Resolve
auto& io_ctx = GlobalIoService::instance();

auto endpoints = co_await resolver_
.async_resolve("api.spotify.com", "443", use_awaitable);

// SSL-stream
ssl_stream stream{io_ctx, ssl_ctx_};
configure_stream(stream, "accounts.spotify.com");

// TCP connection
co_await get_lowest_layer(stream)
.async_connect(endpoints, use_awaitable);

// Handshake
co_await stream
.async_handshake(ssl::stream_base::client, use_awaitable);

/* Form GET-request...*/

// Send request
co_await http::async_write(stream, req, use_awaitable);

// Prepare buffer and response
flat_buffer buf;
http::response res;

// Get response
co_await http::async_read(stream, buf, res, use_awaitable);

// Close TCP-sesson
error_code ec;
co_await stream.async_shutdown(redirect_error(use_awaitable, ec));
/* Handling errors and parse id...*/

co_return id;
}
catch(std::exception& e){
/*handling*/
}
}
< /code>
и GlobalioService: < /p>
struct GlobalIoService::Impl {
boost::asio::io_context io_ctx;
boost::asio::executor_work_guard work_guard;
std::thread io_thread;

Impl()
: work_guard(boost::asio::make_work_guard(io_ctx))
{
io_thread = std::thread([this] {
try {
io_ctx.run();
} catch (...) {
qWarning() io_ctx;
}

void GlobalIoService::start() {
// Initialize on first call
instance();
}

void GlobalIoService::stop() {
impl_.reset();
}
< /code>
Проблема - оптимизация - все занимает очень много времени. Я попытался сделать пул из SSL_STREAM, который я подключаю заранее, но ничего не сработало - скорее всего, факт заключается в том, что несколько асинхронных методов SearchTrack используют один и тот же контекст.
Кроме того, я пытался использовать обычный Boost :: Asio :: Tread_pool, но есть, по сути, та же проблема.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... the-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»