Есть функция совершающая 100 запросов к серверу. Это занимает примерно 5-10 секунд. (Хотя, бывают случаи, когда приходится ждать 16-18 с)
Функция
const PARALLEL_REQUESTS: usize = 8;
fn task(port: u64, start: u64) {
tokio::runtime::Runtime::new().unwrap().block_on(async move {
let client = reqwest::Client::builder()
.proxy(reqwest::Proxy::all(&format!("socks5h://127.0.0.1:{}", port)).unwrap())
.build().unwrap();
let mut offsets: Vec<u64> = vec![];
for i in (start..start + 1000).step_by(10) {
offsets.push(i);
}
let bodies = stream::iter(offsets)
.map(|offset| {
let client = &client;
let url = format!("https://site.ru/test?offset={}", offset).to_owned();
async move {
let resp = client.post(&url)
.header("X-Requested-With", "XMLHttpRequest")
.body("_ajax=1")
.send().await?;
resp.text().await
}
}).buffer_unordered(PARALLEL_REQUESTS);
bodies
.for_each(|b| {
async {
// getting some info
}
})
.await;
});
}
Но если запустить этот код в несколько потоков, то время выполнения становится больше.
fn main() {
let start_time = Instant::now();
let n_workers = 4;
let mut tasks = vec![];
for i in 0..n_workers {
tasks.push(thread::spawn(move || {
task(9000 + i, 15 + (i * 1000));
}));
}
for task in tasks {
let _ = task.join();
}
let delta = Instant::now() - start_time;
println!("Time {}s", delta.as_secs_f64());
}
// Время выполнения функции task тоже измеряю
Takes 5.694900368s
Takes 9.479882614s
Takes 10.280974229s
Takes 12.753506558s
Takes 12.755521696s
Это нормально, что так происходит?
Использую Tor прокси (multitor).
Проблема в том, что Tor прокси - не лучшее решение или в том, что нужно лучше оптимизировать?
Как можно ускорить это?