#stackful-coroutine #coroutine #task #thread

stuck

基于协作式栈式协程的多线程计划任务功能

12 个版本

0.4.0 2024 年 5 月 7 日
0.3.3 2024 年 4 月 13 日
0.3.1 2022 年 4 月 23 日
0.2.0 2022 年 4 月 20 日
0.1.2 2022 年 3 月 26 日

#334 in 并发

Download history 4/week @ 2024-04-19 154/week @ 2024-05-03 12/week @ 2024-05-10 8/week @ 2024-05-17 3/week @ 2024-05-24 3/week @ 2024-06-28 65/week @ 2024-07-05 55/week @ 2024-07-26 6/week @ 2024-08-02

61 每月下载量

MIT 许可证

260KB
7K SLoC

stuck

crates.io github-ci codecov docs.rs mit-license

Stuck 是一个基于协作式栈式协程的多线程计划任务功能。

示例

use std::time::Duration;

use stuck::channel::parallel;
use stuck::channel::prelude::*;
use stuck::{select, task, time};

#[stuck::main]
fn main() {
    let (mut request_sender, request_receiver) = parallel::bounded(1);
    let (mut response_sender, mut response_receiver) = parallel::bounded(1);

    task::spawn(move || {
        for value in request_receiver.into_iter() {
            time::sleep(Duration::from_secs(1));
            response_sender.send(value - 1).unwrap();
        }
    });

    let mut tasks = vec![6, 6, 6, 6];

    let mut sum = 0;
    loop {
        select! {
            r = <-response_receiver => if let Some(n) = r {
                sum += n;
            },
            _ = request_sender<-tasks.pop().unwrap(), if !tasks.is_empty()  => if tasks.is_empty() {
                request_sender.close();
            },
            complete => break,
        }
    }
    println!("sum: {}", sum);
    assert_eq!(sum, 20);
}

更多示例请参阅 测试

许可证

MIT

灵感来源

  • stp: 该库从中派生的 C++ 对应库。
  • skynet: 一个轻量级在线游戏框架

依赖关系

~2–12MB
~86K SLoC