我有一个异步函数,其中有一个 foo 循环:
for item in initial_items {
let local_item = item.clone();
let item_link = local_item.attr("href").unwrap().to_string();
let collected = self.get_single_item(item_link.clone(), currency).await;
items.push(collected);
}
我正在等待
get_single_item
,如果我这样做,整个函数都会出现红色波浪线:
future cannot be sent between threads safely
within `ego_tree::Node<Node>`, the trait `Sync` is not implemented for `Cell<NonZeroUsize>`
if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`
required for the cast from `Pin<Box<{async block@src\carer\executor.rs:138:92: 178:6}>>` to `Pin<Box<dyn futures::Future<Output = Result<model::Response, comparer::error::Error>> + std::marker::Send>>`
现在,如果我将等待修改为
executor::block_on
,我的代码就会编译。顺便说一句,我在运行时使用 tokio。
我不明白为什么这样做会起作用,以及如何让我的代码即使在等待的情况下也能工作。
如果您使用
executor::block_on
,您将阻塞当前线程,直到未来完成。
很难添加可靠的答案,但根据您当前的代码,我可以说造成不同的原因是因为
Future
不是 Send
。
如果你想保持异步,你需要实现函数
get_single_item
并且它必须返回一个标记为Send的Future。
async fn get_single_item(..., currency: Currency) -> Result<..., ...>
{
//TODO: ADD YOUR CODE HERE
}