Как параллельно выполнить карту блокировки http-запросов?

#rust #ureq

Вопрос:

У меня много кода, использующего ureq для http-запросов, и мне интересно, смогу ли я избежать использования другой http-библиотеки.

У меня есть список URL-адресов, и я вызываю ureq::перейдите по ним. Мне интересно, смогу ли я каким-то образом совершать эти звонки параллельно. Как бы я мог создавать отдельные потоки и выполнять их параллельно?

 let v = vec!["www.qwe.com"; 3];
let responses = v.into_iter().map(|s| make_get_request(s)).collect::<Vec<_>>();
 

Ответ №1:

Вы можете просто использовать вискозу. Это не идеально , потому что это предполагает ЦП и, следовательно, нерест один поток на (логических) ядра по умолчанию, который может быть меньше, чем вы хотели бы, чтобы HTTP-запросы, но вы всегда может настроить глобальный пул потоков (или выполнять работы внутри рамки локального пула потоков с более высоким нитей).

Комментарии:

1. Является ли настройка количества нитей особенностью вискозы или это делается как-то иначе?

2. Это особенность района, проверьте threadpoolbuilder.

Ответ №2:

Если вам нужно столько потоков, сколько запросов, вы можете просто создать их:

 let v = vec!["www.qwe.com"; 3];
let handles = v
    .into_iter()
    .map(|s| thread::spawn(move || make_get_request(s)))
    .collect::<Vec<_>>();
let responses = handles.into_iter().map(|h| h.join()).collect::<Vec<_>>();
 

Игровая площадка