#thread #generator #green #parallel #green-threads

bin+lib greenie

Green threads and coroutines in stable Rust

5 releases (3 breaking)

0.4.0 Jan 11, 2020
0.3.0 Jan 10, 2020
0.2.0 Jan 8, 2020
0.1.2 Jan 7, 2020
0.1.1 Jan 7, 2020

#610 in Concurrency

25 downloads per month

MIT license

59KB
1.5K SLoC

greenie

Simple green threads in Rust programming language.

Features

  • Generators in stable Rust!
  • Synchronization primitives: Mutex,Condvar others will be implemented later ( see TODO ).
  • Fast.
  • Semi-automatic scheduling using greenify macro that inserts yield points in your functions.

TODO

  • Preemptive scheduling
  • Implement FIFO schedulign algorithm
  • Implement RwLock.
  • Futures

Example

Condvar and Mutex example:

use greenie::channel::*;

use greenie::{greeny_main, Fiber};
#[greeny_main]
fn main() {
    let chan_1 = Channel::<&'static str>::new(2);
    let chan_2 = Channel::<&'static str>::new(2);

    let fping = Fiber::new_capture(
        |chan_1, chan_2| {
            chan_1.push("ping");
            println!("{}", chan_2.pop().unwrap());
            chan_1.push("ping");
            println!("{}", chan_2.pop().unwrap());
            chan_1.push("ping");
            println!("{}", chan_2.pop().unwrap());
        },
        (chan_1.clone(), chan_2.clone()),
    );
    let fpong = Fiber::new_capture(
        |chan_1, chan_2| {
            chan_2.push("pong");
            println!("{}", chan_1.pop().unwrap());
            chan_2.push("pong");
            println!("{}", chan_1.pop().unwrap());
            chan_2.push("pong");
            println!("{}", chan_1.pop().unwrap());
        },
        (chan_1.clone(), chan_2.clone()),
    );

    fpong.start().unwrap();
    fping.start().unwrap();
}

For more examples read documentation or examples/

Dependencies

~3.5MB
~75K SLoC