提问人:jjangga 提问时间:10/30/2023 最后编辑:kmdrekojjangga 更新时间:11/8/2023 访问量:60
跨线程的“.clone()”池“diesel_async”是否安全?
Is it safe to `.clone()` Pool of `diesel_async` across threads?
问:
我正在使用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
这个例子适合满足我的意图吗?
答:
2赞
Chayim Friedman
10/30/2023
#1
通常在 Rust 中,如果某些内容不能在线程之间共享,编译器会阻止你这样做。
在本例中,Pool
两者都是 ,因此跨线程共享是安全的。它还在内部包装了一个 Arc
,因此克隆成本低廉,而且您不需要自己的 .Send + Sync
Arc
此结构可以跨线程边界进行克隆和传输,并对其内部状态使用引用计数。
评论
0赞
jjangga
10/31/2023
你好!谢谢你的回答。我实际上从你的回答中也这么认为,但我写这个问题的原因是发生了一些奇怪的事情。你也来看这个吗?stackoverflow.com/questions/77394594/......
评论