#async-pool #pool #async #priority

游泳池

一个简单的通用池,支持同步和异步

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

Download history 454/week @ 2024-04-09 504/week @ 2024-04-16 302/week @ 2024-04-23 437/week @ 2024-04-30 230/week @ 2024-05-07 471/week @ 2024-05-14 616/week @ 2024-05-21 856/week @ 2024-05-28 514/week @ 2024-06-04 430/week @ 2024-06-11 589/week @ 2024-06-18 371/week @ 2024-06-25 463/week @ 2024-07-02 299/week @ 2024-07-09 232/week @ 2024-07-16 205/week @ 2024-07-23

1,279 每月下载次数

MIT/Apache

56KB
1K SLoC

游泳池

一个简单的通用池,支持同步和异步。

crate_version docs_version

提供两种类型的池

  • 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