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
字段。
这个例子是否适合满足我的意图?
通常在 Rust 中,如果某些内容无法跨线程共享,编译器将阻止您这样做。
Pool
都是Send + Sync
,因此跨线程共享是安全的。 它还在内部包裹了一个 Arc
,因此克隆起来很便宜,而且您不需要自己的 Arc
。
这甚至被记录在案:
该结构可以跨线程边界克隆和传输,并对其内部状态使用引用计数。