use*_*375 5 rust rust-tokio reqwest
异步示例很有用,但作为Rust和Tokio的新手,我正在努力研究如何一次执行N个请求,使用向量中的URL,并为每个URL创建响应HTML的迭代器作为字符串.
怎么可以这样做?
She*_*ter 18
截至reqwest 0.9:
use futures::{stream, Future, Stream}; // 0.1.26
use reqwest::r#async::Client; // 0.9.14
use tokio; // 0.1.18
type Result<T> = std::result::Result<T, Box<std::error::Error>>;
const PARALLEL_REQUESTS: usize = 2;
fn main() -> Result<()> {
let client = Client::new();
let urls = vec!["https://api.ipify.org", "https://api.ipify.org"];
let bodies = stream::iter_ok(urls)
.map(move |url| {
client
.get(url)
.send()
.and_then(|res| res.into_body().concat2().from_err())
})
.buffer_unordered(PARALLEL_REQUESTS);
let work = bodies
.for_each(|b| {
println!("Got {} bytes", b.len());
Ok(())
})
.map_err(|e| panic!("Error while processing: {}", e));
tokio::run(work);
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)stream::iter_ok(urls)
获取字符串集合并将其转换为Stream.
Run Code Online (Sandbox Code Playgroud).and_then(|res| res.into_body().concat2().from_err())
Stream::concat2, Stream::from_err
获取每个响应的正文流并将其全部收集到一个大块中.
Run Code Online (Sandbox Code Playgroud).buffer_unordered(N);
将期货流转换为未来价值流,并行执行期货.
Run Code Online (Sandbox Code Playgroud)let work = bodies.for_each(|b| { println!("Got {} bytes", b.len()); Ok(()) });
将流转换回未来.
也可以看看:
| 归档时间: |
|
| 查看次数: |
3107 次 |
| 最近记录: |