我想并行运行两个Future,如果可能的话,在不同的线程中运行:

try_join!(
  tokio::spawn(fut1), // fut1 is not 'static
  tokio::spawn(fut2)
)?;

如果我的理解是正确的,tokio::spawn需要Future等于'static,因为执行是立即开始的,并且不能保证future 不会超过当前的作用域.

然而,在我的情况下,我立即await个,所以我知道它不会超过当前的范围.

我的推理正确吗?如果不是,在我的例子中传递非'static个参数有什么不安全之处?

推荐答案

然而,在我的情况下,我会立即等待他们,所以我知道它不会超过当前的范围.

对于这一推理,有两种回应.

其一,您立即等待的事实与编译器执行的判断没有任何关系.tokio::spawn()需要一个拥有其数据的future ,这只是一个事实--您如何使用它并不重要,或者换句话说,编译器甚至不会try 足够智能地覆盖这样的界限,即使在它看起来安全的地方也是如此.

另一种react 是,你所说的实际上并不是真的.是的,您立即等待结果,但这不能保证传递到spawn()的future 不会超过当前作用域.等待future 只是意味着,如果等待的future Select 挂起,等待它的异步功能也会一起挂起.由Async函数创建的外部future 可能在等待完成之前被丢弃,在这种情况下,作用域在fut1仍在运行时消失.例如:

// let's assume this function were allowed to compile
async fn foo() {
    let mut i = 0;
    tokio::spawn(async {
        sleep(1).await;
        i = 1;
    }).await;
    assert!(i == 1);
}

// this function is safe and compiles
async fn bar() {
    {
        // create the foo() future in an inner scope
        let fut = foo();
        // spin up the future created by `foo()` by polling it just once
        Box::pin(fut)
            .as_mut()
            .poll(&mut Context::from_waker(&futures::task::noop_waker()));
        // leave fut to go out of scope and get dropped
    }
    // what memory does `i = 1` modify after 1s?
}

Rust相关问答推荐

如何在rust中有条件地分配变量?

如何从Rust记录WASM堆内存使用情况?

关于Rust 中回归的逻辑

如何从铁 rust 中呼唤_mm_256_mul_ph?

下载压缩文件

如何格式化传入Rust中mysql crate的Pool::new的字符串

告诉Rust编译器返回值不包含构造函数中提供的引用

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

我如何制作一个变异迭代器来锁定内部数据直到删除?

为什么我需要 to_string 函数的参考?

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

仅发布工作区的二进制 crate

如何以与平台无关的方式将OsString转换为utf-8编码的字符串?

返回迭代器考虑静态生命周期类型

为什么在 rust 中删除 vec 之前应该删除元素

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

仅当满足外部条件时如何添加到 actix web 的路由

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

Cargo:如何将整个目录或文件包含在功能标志中?