5个版本
0.2.1 | 2023年2月23日 |
---|---|
0.2.0 | 2023年2月23日 |
0.1.2 | 2023年2月22日 |
0.1.1 | 2023年2月22日 |
0.1.0 | 2023年2月21日 |
#13 in #priority
1,279 每月下载次数
56KB
1K SLoC
游泳池
一个简单的通用池,支持同步和异步。
提供两种类型的池
Pool
: 一个支持同步和异步的简单池。PriorityPool
: 带有优先级的项的池,支持同步和异步。
这个crate内部使用futures_channel::oneshot
,因此是无锁的。
功能
default = []
以下功能与日志记录错误相关,这些错误应该是无法到达的。
log
: 启用使用log
crate进行日志记录。tracing
: 启用使用tracing
crate进行日志记录。
示例
非异步 Pool
示例
use piscina::Pool;
let mut pool = Pool::new();
pool.put(1);
pool.put(2);
let item1 = pool.try_get();
assert!(item1.is_some());
let item2 = pool.blocking_get();
let none = pool.try_get();
assert!(none.is_none());
drop(item1); // Return the item to the pool by dropping it
let item3 = pool.try_get();
assert!(item3.is_some());
异步 Pool
示例
use piscina::Pool;
futures::executor::block_on(async {
let mut pool = Pool::new();
pool.put(1);
pool.put(2);
let item1 = pool.get().await;
let item2 = pool.get().await;
let none = pool.try_get();
assert!(none.is_none());
drop(item1); // Return the item to the pool by dropping it
let item3 = pool.get().await;
});
非异步 PriorityPool
示例
use piscina::PriorityPool;
let mut pool = PriorityPool::new();
pool.put("hello", 1);
pool.put("world", 2); // Larger value means higher priority.
// Get the highest priority item.
let item = pool.try_get();
assert!(item.is_some());
let item = item.unwrap();
assert_eq!(item.item(), &"world");
let another_item = pool.try_get();
assert!(another_item.is_some());
let another_item = another_item.unwrap();
assert_eq!(another_item.item(), &"hello");
// The pool is now empty.
let empty_item = pool.try_get();
assert!(empty_item.is_none());
drop(another_item); // Return the item back to the pool by dropping it.
let hello = pool.try_get();
assert!(hello.is_some());
assert_eq!(hello.unwrap().item(), &"hello");
异步 PriorityPool
示例
use piscina::PriorityPool;
let mut pool = PriorityPool::new();
pool.put("hello", 1);
pool.put("world", 2); // Larger value means higher priority.
futures::executor::block_on(async {
// Get the highest priority item.
let world = pool.get().await;
assert_eq!(world.item(), &"world");
let hello = pool.get().await;
assert_eq!(hello.item(), &"hello");
// The pool is now empty.
drop(hello); // Return the item back to the pool by dropping it.
let item = pool.get().await;
assert_eq!(item.item(), &"hello");
});
安全性
该crate不使用Option
,而是在PooledItem
中使用不安全代码ManuallyDrop
。唯一使用不安全代码ManuallyDrop::take()
的情况是在PooledItem
被丢弃时。
许可:MIT/Apache-2.0
依赖关系
~0.6–0.9MB
~16K SLoC