代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

如何将非静态变量传递给异步块?

  •  1
  • Evan Carroll  · 技术社区  · 3 年前

    根据以下文件 task::spawn (注:我正在使用 tokio::spawn 其看起来相似但缺少描述)

    这个 'static 约束意味着闭包及其返回值必须具有整个程序执行的生命周期。这样做的原因是线程可以分离并超过其创建的生命周期。事实上,如果线程及其返回值可以超过其调用者,我们需要确保它们在之后是有效的,并且由于我们不知道它何时返回,我们需要尽可能长时间地保持有效,即直到程序结束,因此 '静态 终身。

    我试图通过一个 Url 变成这样的线,

    do_update(confg.to_feed_url()).await;
    

    我在哪里做这件事 do_update ,

      async fn do_update(url: Url) {
        let task = task::spawn(async {
          let duration = Duration::from_millis(5_000);
          let mut stream = time::interval(duration);
          stream.tick().await;
          loop {
            feeds::MyFeed::from_url(url.clone(), true);
    

    这不起作用并产生这些错误,

    error[E0373]:异步块的寿命可能比当前函数长,但它借用了 url ,由当前职能部门拥有

    我已经阅读了文档,但这对我来说没有多大意义,因为我正在块中克隆。我该如何解决这个错误?

    1 回复  |  直到 3 年前
        1
  •  4
  •   bk2204    3 年前

    在这种情况下,如果你不需要其他地方的URL,你可以写 async move 为你的街区而不是 async ,这将把URL(以及块捕获的任何其他内容,看起来都是空的)移动到块中。

    如果你在其他地方确实需要它,那么你可以克隆 url 块外的变量,然后执行相同的操作( 异步移动 )只将该特定变量移动到块中,而不是 url 本身。这个 clone 在这种情况下,可能不需要打电话。

    这是因为 url 住在街区外,打电话 url.clone 借用它(可能是不变的,但这取决于实现)。由于它的作用域是这个函数,而不是程序的生命周期,因此它不会为 'static 因此,您需要将其移动到区块中,而不是借用。