跨线程的“.clone()”池“diesel_async”是否安全?

Is it safe to `.clone()` Pool of `diesel_async` across threads?

提问人:jjangga 提问时间:10/30/2023 最后编辑:kmdrekojjangga 更新时间:11/8/2023 访问量:60

问:

我正在使用diesel_async

假设我在死侍中有联系。 我想要总连接数。deadpool_max_size

let pool: Pool<AsyncPgConnection> = Pool::builder(deadpool_config)
    .max_size(deadpool_max_size)
    .build()
    .unwrap();

而且我必须在多个任意数量的异步线程之间共享池。

// share the pool with async thread
let _pool = pool.clone();
tokio::spawn(async move { 
    let mut conn = _pool.get().await.unwrap();
    // ... using conn
});

// and another different async thread
let _pool = pool.clone();
tokio::spawn(async move { 
    let mut conn = _pool.get().await.unwrap();
    // ... using conn
});
 
// and so on...
// let _pool = pool.clone(); 
// tokio::spawn(async move { .......

我希望整个 rust 程序生成的连接总数在任何时候都必须小于或等于。deadpool_max_size

在上面的示例中,我没有用 、 或 包装池。 但只是直接用了纯的。 原因是我看到类型中已经有字段。ArcMutexRwLock.clone()Arc

这个例子适合满足我的意图吗?

多线程 异步 Rust-diesel Rust-Axum

评论


答:

2赞 Chayim Friedman 10/30/2023 #1

通常在 Rust 中,如果某些内容不能在线程之间共享,编译器会阻止你这样做。

在本例中,Pool 两者都是 ,因此跨线程共享是安全的。它还在内部包装了一个 Arc,因此克隆成本低廉,而且您不需要自己的 .Send + SyncArc

这甚至被记录在案

此结构可以跨线程边界进行克隆和传输,并对其内部状态使用引用计数。

评论

0赞 jjangga 10/31/2023
你好!谢谢你的回答。我实际上从你的回答中也这么认为,但我写这个问题的原因是发生了一些奇怪的事情。你也来看这个吗?stackoverflow.com/questions/77394594/......