Я работаю над приложением, которое связано с 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
Как реализовать несколько асинхронных запросов на сервер? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1753361330
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, но есть, по сути, та же проблема.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79713380/how-to-implement-multiple-asynchronous-requests-to-the-server[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия