等待并发线程的首选方法

时间:2016-02-27 13:30:29

标签: multithreading rust

我有一个循环HTTP响应的程序。这些不依赖于彼此,因此它们可以同时完成。我正在使用线程来执行此操作:

extern crate hyper;

use std::thread;
use std::sync::Arc;
use hyper::Client;

fn main() {
    let client = Arc::new(Client::new());
    for num in 0..10 {
        let client_helper = client.clone();
        thread::spawn(move || {
            client_helper.get(&format!("http://example.com/{}", num))
             .send().unwrap();
        }).join().unwrap();
    }
}

这有效,但我可以看到其他可能性,例如:

let mut threads = vec![];

threads.push(thread::spawn(move || {
/* snip */
for thread in threads {
    let _ = thread.join();
}

使用返回线程处理程序的函数对我来说也是有意义的,但我无法弄清楚如何做到这一点......不确定返回类型必须是什么。

在Rust中等待并发线程的最佳/推荐方法是什么?

1 个答案:

答案 0 :(得分:3)

您的第一个程序实际上没有任何并行性。每次启动工作线程时,您都会在开始下一个工作线程之前立即等待它完成。当然,这比无用还要糟糕。

第二种方式有效,但有些箱子可以为你做一些繁忙的工作。例如,scoped_threadpoolcrossbeam具有允许您编写类似(未经测试,可能包含错误)的线程池:

let client = &Client::new();// No Arc needed
run_in_pool(|scope| {
    for num in 0..10 {
        scope.spawn(move || {
            client.get(&format!("http://example.com/{}", num)).send().unwrap();
        }
    }
})