让我们考虑以下示例:
主文件
use futures::executor::block_on;
use futures::future::{FutureExt, TryFutureExt};
async fn fut1() -> Result<String, u32> {
Ok("ok".to_string())
}
fn main() {
println!("Hello, world!");
match block_on(fut1().and_then(|x| async move { Ok(format!("{} is \"ok\"", x)) })) {
Ok(s) => println!("{}", s),
Err(u) => println!("{}", u)
};
}
Run Code Online (Sandbox Code Playgroud)
Cargo.toml
[dependencies]
futures = "^0.3"
Run Code Online (Sandbox Code Playgroud)
我问的是表达式|x| async move {}而不是async move |x| {}. 后者更明显,但遇到编译错误:
error[E0658]: async closures are unstable
Run Code Online (Sandbox Code Playgroud)
然后我想知道,async move || {}和之间有什么区别|| async move {}。它们似乎都是使用move关键字的闭包。
$ rustc --version …Run Code Online (Sandbox Code Playgroud) 我有一个通用struct设置和一个额外的变量设置,我想调整和使用。
对于整数范围内的所有可能值,我想启动一个(作用域)线程,并将此变量设置为该值。根据这个值,它们做的工作略有不同。
这些线程中的每一个都应该能够读取常规设置结构。
use crossbeam; // 0.7.3
struct Settings {
// ... many fields
}
const MAX_FEASIBLE_SCORE: u8 = 10;
fn example(settings: Settings) {
crossbeam::scope(|scope| {
for score in 0..MAX_FEASIBLE_SCORE {
scope.spawn(|_| {
let work_result = do_cool_computation(&settings, score);
println!("{:?}", work_result);
});
}
})
.unwrap();
}
fn do_cool_computation(_: &Settings, _: u8) {}
Run Code Online (Sandbox Code Playgroud)
这不编译:
use crossbeam; // 0.7.3
struct Settings {
// ... many fields
}
const MAX_FEASIBLE_SCORE: u8 = 10;
fn example(settings: Settings) {
crossbeam::scope(|scope| {
for score in …Run Code Online (Sandbox Code Playgroud) 我阅读了tokio文档,我想知道将来封装昂贵的同步I/O的最佳方法是什么.
使用reactor框架,我们可以获得绿色线程模型的优势:一些OS线程通过执行程序处理大量并发任务.
未来的tokio模型是需求驱动的,这意味着未来本身将轮询其内部状态以提供有关其完成的信息; 允许背压和取消功能.据我了解,未来的投票阶段必须是非阻塞才能运作良好.
I/OI想要封装可以看作是一个长期的原子和昂贵的操作.理想情况下,独立任务将执行I/O,并且相关联的未来将轮询I/O线程以获得完成状态.
我看到的两个唯一选择是:
poll在将来的功能中.据我所知,这两种解决方案都不是最优的,并且没有充分利用绿色线程模型(首先不在文档中建议,其次不通过reactor框架提供的执行程序).还有其他解决方案吗?
异步示例很有用,但作为Rust和Tokio的新手,我正在努力研究如何一次执行N个请求,使用向量中的URL,并为每个URL创建响应HTML的迭代器作为字符串.
怎么可以这样做?