0

我希望能够在后台启动未来运行,而不是立即在父函数范围内等待它。

类似于动态的东西join_all,我可以在循环中将新期货添加到集合中,然后将集合传递给另一个函数,该函数可以等待整个集合(已经在运行)。

我希望能够做这样的事情:

join_all(vec![
    log_arg(&c),
    log_arg(&c)
]).await;

但问题是:

  • .await开始执行未来,但也在当前函数处等待它
    • 如何在不等待的情况下开始执行?
  • &c不是'static
    • 似乎是所有 Tokio API 的要求,即“开始未来执行而不等待当前 fn 范围内的结果”,例如spawn_local
    • 如果所有期货都在一个线程上,那就可以了。

例子:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=85aa3a517bd1906b285f5a5586d7fa6d

4

1 回答 1

1

如何在不等待的情况下开始执行?

spawn一个任务。

似乎是所有 Tokio API 的要求,即“开始未来执行而不等待当前 fn 范围内的结果”,例如spawn_local

好吧,是的,因为您正在生成一个任务,所以该任务可能会比拥有该项目的任何东西的寿命更长,从而导致悬空引用,这是不允许的。事实上,在使用时它几乎是一种保证spawn_local:它将在同一个线程(/调度程序)上生成一个任务,并且在当前任务产生或终止之前根本无法运行。

另一种选择是使用“范围任务”(不必立即等待,但最终必须加入)。然而,到目前为止,在 tokio 中对结构化并发(范围任务)的支持已经死了。因此,Rust 编译器无法知道任务不会从初始化它的范围“逃脱”,因此它必须假设它确实如此,因此无论任务捕获的内容都应该能够超过当前范围。

于 2021-10-18T11:44:03.143 回答