#container #tokio #wait-group #async #btree-map #vec #read-write

dark-std

dark-std 是基于 tokio 构建的异步容器的实现。它采用了从 Golang 借鉴的读写分离设计

4 个版本

0.2.16 2024年7月7日
0.2.14 2024年5月3日
0.2.11 2024年3月15日
0.2.9 2023年12月11日
0.1.2 2022年3月13日

#121 in 异步

Download history 802/week @ 2024-04-15 965/week @ 2024-04-22 1214/week @ 2024-04-29 929/week @ 2024-05-06 634/week @ 2024-05-13 910/week @ 2024-05-20 940/week @ 2024-05-27 1232/week @ 2024-06-03 1230/week @ 2024-06-10 1309/week @ 2024-06-17 1207/week @ 2024-06-24 1546/week @ 2024-07-01 1463/week @ 2024-07-08 1188/week @ 2024-07-15 1302/week @ 2024-07-22 1260/week @ 2024-07-29

5,414 每月下载次数
用于 32 个 crate(5 个直接使用)

MIT/Apache

51KB
1.5K SLoC

dark-std

dark-std 是异步的实现

  • defer! (defer 宏)
  • SyncHashMap (异步 HashMap)
  • SyncBtreeMap (异步 BtreeMap)
  • SyncVec (异步 Vec)
  • WaitGroup (异步/阻塞所有支持 WaitGroup)
  • AtomicDuration (原子持续时间)

例如

    #[tokio::test]
    pub async fn test_get() {
        let m = SyncHashMap::<i32, i32>::new();
        let insert = m.insert(1, 2);
        
        let g = m.get(&1).unwrap();//don't need lock and await
        assert_eq!(&2, g);
    }

等待组

use std::time::Duration;
use tokio::time::sleep;
use dark_std::sync::WaitGroup;
#[tokio::test]
async fn test_wg() {
    let wg = WaitGroup::new();
    let wg2 = wg.clone();
    tokio::spawn(async move {
        sleep(Duration::from_secs(1)).await;
        drop(wg2);
    });
    let wg2 = wg.clone();
    tokio::spawn(async move {
        sleep(Duration::from_secs(1)).await;
        drop(wg2);
    });
    wg.wait_async().await;
    println!("all done");
}

依赖

~1.4–6.5MB
~37K SLoC