Задать вопрос
Minute
@Minute
Пародирую программистов

Как правильно распараллелить?

Есть функция совершающая 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 прокси - не лучшее решение или в том, что нужно лучше оптимизировать?
Как можно ускорить это?
  • Вопрос задан
  • 209 просмотров
Подписаться 3 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега Rust
При http запросах всё будет упираться в ввод-вывод, так что очень вероятно, что сам тор медленно работает - тогда лучше наоборот урегулировать количество одновременных запросов.

Как именно это сделать не подскажу, тк в rust разбираюсь не очень хорошо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы