跨线程使用“diesel_async”的“.clone()”池安全吗?

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

我正在使用

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

在上面的示例中,我没有用

Arc
Mutex
RwLock
包裹泳池。 但直接用纯
.clone()
就可以了。 原因是我看到类型中已经有
Arc
字段。

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

multithreading asynchronous rust rust-diesel rust-axum
1个回答
2
投票

通常在 Rust 中,如果某些内容无法跨线程共享,编译器将阻止您这样做。

在这种情况下,

Pool
都是
Send + Sync
,因此跨线程共享是安全的。 它还在内部包裹了一个
Arc
,因此克隆起来很便宜,而且您不需要自己的
Arc

这甚至被记录在案

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

© www.soinside.com 2019 - 2024. All rights reserved.