如何构造!在另一个线程上发送对象?

问题描述 投票:0回答:1

我有以下代码:

trait Foo {
  fn do_it(&self) -> ();
}

struct FooImpl {
  make_this_not_send: *const (),
}

impl Foo for FooImpl { ... }

fn spawn(new: impl FnOnce() -> Box<dyn Foo> + Send + 'static) {
  tokio::spawn(async move {
    let foo = new();
    
    loop {
      foo.do_it();

      // ...
    }
  });
}

问题是这无法编译,因为

Foo
不容易
Send
。我真的不明白为什么需要这样做。我只想在某个线程中创建一个 foo 并将其留在那里。我希望上面概述的
new()
方法能够做到这一点,但它仍然需要
Foo
Send

为什么需要是

Send
? 解决这个问题的惯用方法是什么?

rust async-await
1个回答
0
投票

默认的 tokio 运行时是多线程的,因此这意味着任何

Future
都必须能够
Send
到另一个线程。

这意味着任何在

async
调用中拥有非
Send
对象的
.await
函数都不会是
Send
并且不能与多线程运行时一起使用。

您有两个选择:

  • 限制
    Send
    调用之间非
    .await
    对象的范围。
  • 使用单线程运行时,不需要
    Future
    Send
© www.soinside.com 2019 - 2024. All rights reserved.