tide 和 Tokio 中共享不可变引用的惯用方法是什么?

What is the idiomatic approach for shared immutable references in tide and Tokio?

我正在使用带状态的潮汐服务器开发 RPC 客户端。我将另一个客户端置于该状态,以便我的端点可以使用它:

let client = MintClient::new(cfg, Arc::new(db), Default::default());
let state = State {
    mint_client: Arc::new(client),
};
let mut app = tide::with_state(state);

端点是:

app.at("/info")
    .post(|req: tide::Request<State>| async move {
        let State { ref mint_client } = req.state();
        Body::from_json(&InfoResponse::new(mint_client.coins()))
    });

我从现有代码中复制了 Arc,但我不知道它是如何工作的,有人告诉我在我的情况下它是不必要的。

如果我不使用 State,我会收到错误消息“此闭包实现 FnOnce,而不是 Fn”。如果我删除 move 以便它借用客户端,我会在 req 参数上得到“可能比借用的值 client 长寿”。

我不知道该如何处理。我是否应该使用函数而不是闭包作为端点并将不可变引用传递给它们,然后使用通用生命周期?是否也可以在闭包上使用通用生命周期?

with_state 要求国家实施 Clone + Send + Sync + 'static(参见 https://docs.rs/tide/0.16.0/tide/fn.with_state.html)。

如果您想共享 MintClient,而不是克隆它,您将需要某种类型的参考。由于需要thread-safety(Send + Sync),所以不能使用普通引用(有生命周期)或者Rc,必须是Arc。

but I don't know how it works and someone told me its unnecessary in my situation.

Arc 拥有该对象,并且可以根据需要为您提供通常的不可变引用。它实现了克隆,因此可以创建它的多个副本(这对共享很有用)。它实现了 Send + Sync,因此可以在没有数据竞争的情况下在线程之间安全地传递(Tokio 是 multi-threaded)。

拥有的对象将保持活动状态,直到最后一个 Arc 克隆掉落。在您的情况下,它与 app 生命周期相关联,因此当服务器处于 运行.

时,它可能永远不会删除 MintClient

在此处阅读更多内容: https://doc.rust-lang.org/std/sync/struct.Arc.html