Я работаю над приложением, которое связано с 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