employees 0.1.0

A small runtime that hides all the boilerplate when using threads.
Documentation
# `employees`


A small and lightweight crate to hide most of the burden of setting up long-living threads.

# Philosophy


This crate sees threads as unique entities called `workers` which may (or may not) live as long as the program lives. `Workers` are spawned in `Runtimes` that manage them.

# Usage


Here's a small example that spawns a worker that prints "Hello, World!" every 100ms for 1 second.

```rust
struct WorkerThatPrints;
impl Worker for WorkerThatPrints {
    fn on_update(&mut self) -> ControlFlow {
        println!("Hello, World!");
        std::thread::sleep(Duration::from_millis(100));
        ControlFlow::Continue
    }
}

let mut runtime = Runtime::new();

runtime.launch(WorkerThatPrints);
std::thread::sleep(Duration::from_secs(1));
```

See [the full documentation](https://docs.rs/employees/latest/employees/) for more in depth details.

# Should I use `employees`?


## Concurrency


`employees` is built with *CPU-bound concurrency* in mind.

"But wait, arent't async runtimes built for that purpose?" you might ask, and you'll be 100% right.

However, `async` has drawbacks which `employees` hasn't:

* async tasks must not be blocking,
* the famous [colored function problem]https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/.

That said, there are usecases where async runtime will be better such as I/O bound tasks (web servers, ect.) or concurrent tasks on single threaded platforms.

## Paralellism


Again, `employees` is built with *concurrency* in mind. While it is possible to build a work stealing thread pool from `employees` to parallelize some kind of computation, other crates such as [`rayon`](https://docs.rs/rayon/latest/rayon/) add a ton of utilities speficically made for that purpose which is why, for most paralellism usecases, `rayon`-like crates will be a better choice.

# License


Licensed under the terms of MIT license. See [LICENSE](LICENSE) for details.