众所周知,异步代码不应该在两次等待之间运行很长时间.尽管如此,有时异步代码需要执行长时间运行的操作,如阻塞IO.在这些情况下,通常的建议似乎是使用tokio::task::spawn_blocking
(例如,请参阅Tokio开发人员之一的this blog post).
The trouble is, as with regular tokio::task::spawn
, spawn_blocking
must own all the data it accesses (or it must have 'static
lifetime), even when immediately awaiting it (see Why does `tokio::spawn` requires a `'static` lifetime if I immediately await it?).
因此,这样的代码将不会编译:
fn foo(my_ref: &ExpensiveToClone) {
// Do some stuff that blocks for IO
}
async fn foo_the_reference(my_ref: &ExpensiveToClone) {
spawn_blocking(move || {
foo(my_ref);
}).await;
}
有没有办法在没有这种静态生命周期限制的情况下从异步代码运行阻塞代码?