Skip to content
/ stuck Public

Multi-threading task facility building on cooperative stackful coroutine

License

Notifications You must be signed in to change notification settings

kezhuw/stuck

Repository files navigation

stuck

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

Stuck is a multi-threading scheduled task facility building on cooperative stackful coroutine.

Examples

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);
}

See tests for more examples.

LICENSE

MIT

Inspiration

  • stp: The C++ counterpart that this library derives from.
  • skynet: A lightweight online game framework

About

Multi-threading task facility building on cooperative stackful coroutine

Resources

License

Stars

Watchers

Forks

Packages

No packages published