我有一个循环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中等待并发线程的最佳/推荐方法是什么?
答案 0 :(得分:3)
您的第一个程序实际上没有任何并行性。每次启动工作线程时,您都会在开始下一个工作线程之前立即等待它完成。当然,这比无用还要糟糕。
第二种方式有效,但有些箱子可以为你做一些繁忙的工作。例如,scoped_threadpool
和crossbeam
具有允许您编写类似(未经测试,可能包含错误)的线程池:
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();
}
}
})