我有以下代码:
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
?
解决这个问题的惯用方法是什么?
默认的 tokio 运行时是多线程的,因此这意味着任何
Future
都必须能够 Send
到另一个线程。
这意味着任何在
async
调用中拥有非 Send
对象的 .await
函数都不会是 Send
并且不能与多线程运行时一起使用。
您有两个选择:
Send
调用之间非 .await
对象的范围。Future
为 Send