future 无法在异步代码中安全地在线程之间发送

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

我有一个异步函数,其中有一个 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。

我不明白为什么这样做会起作用,以及如何让我的代码即使在等待的情况下也能工作。

asynchronous rust async-await rust-tokio
1个回答
0
投票

如果您使用

executor::block_on
,您将阻塞当前线程,直到未来完成。

很难添加可靠的答案,但根据您当前的代码,我可以说造成不同的原因是因为

Future
不是
Send

如果你想保持异步,你需要实现函数

get_single_item
并且它必须返回一个标记为Send的Future。

async fn get_single_item(..., currency: Currency) -> Result<..., ...>
{
   //TODO: ADD YOUR CODE HERE
}
© www.soinside.com 2019 - 2024. All rights reserved.