相关疑难解决方法(0)

`|_| 和有什么不一样 异步移动{}`和`异步移动|_| {}`

让我们考虑以下示例:

主文件

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)

rust

28
推荐指数
1
解决办法
9725
查看次数

有没有办法让 Rust 闭包只将一些变量移入其中?

我有一个通用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)

multithreading closures lifetime move-semantics rust

15
推荐指数
2
解决办法
3073
查看次数

在将来-rs中封装阻塞I/O的最佳方法是什么?

我阅读了tokio文档,我想知道将来封装昂贵的同步I/O的最佳方法是什么.

使用reactor框架,我们可以获得绿色线程模型的优势:一些OS线程通过执行程序处理大量并发任务.

未来的tokio模型是需求驱动的,这意味着未来本身将轮询其内部状态以提供有关其完成的信息; 允许背压和取消功能.据我了解,未来的投票阶段必须是非阻塞才能运作良好.

I/OI想要封装可以看作是一个长期的原子和昂贵的操作.理想情况下,独立任务将执行I/O,并且相关联的未来将轮询I/O线程以获得完成状态.

我看到的两个唯一选择是:

  • 将阻塞I/O包含poll在将来的功能中.
  • 产生OS线程以执行I/O并使用未来机制轮询其状态,如文档中所示

据我所知,这两种解决方案都不是最优的,并且没有充分利用绿色线程模型(首先不在文档中建议,其次不通过reactor框架提供的执行程序).还有其他解决方案吗?

performance future rust

9
推荐指数
1
解决办法
1699
查看次数

如何使用reqwest执行并行异步HTTP GET请求?

异步示例很有用,但作为Rust和Tokio的新手,我正在努力研究如何一次执行N个请求,使用向量中的URL,并为每个URL创建响应HTML的迭代器作为字符串.

怎么可以这样做?

rust rust-tokio reqwest

5
推荐指数
1
解决办法
3107
查看次数