An open API service indexing awesome lists of open source software.

https://github.com/jgardona/rpools

A minimalist rust workerpool implementation that uses channels to synchronize the jobs. It can spawn a fixed number of worker threads, that waits for a job queue.
https://github.com/jgardona/rpools

concurrency library threadpool worker-pool

Last synced: 3 months ago
JSON representation

A minimalist rust workerpool implementation that uses channels to synchronize the jobs. It can spawn a fixed number of worker threads, that waits for a job queue.

Awesome Lists containing this project

README

          

# rpools



Crates.io


Crates.io Downloads

Rust Stable

License


GitHub Actions Workflow Status

A minimalist rust workerpool implementation that uses channels to synchronize the jobs. It can spawn a fixed number of worker threads, that waits for a job queue.

## Install

```
$ cargo add rpools
```

## Usage

* **A simple workerpool**
```rust
use rpools::pool::WorkerPool;
use std::sync::mpsc::channel;
use std::sync::{Arc, Mutex};

let n_workers = 4;
let n_jobs = 8;
let pool = WorkerPool::new(n_workers);

let (tx, rx) = channel();
let atx = Arc::new(Mutex::new(tx));
for _ in 0..n_jobs {
let atx = atx.clone();
pool.execute(move|| {
let tx = atx.lock().unwrap();

// a long task goes here
// send results to channel (use it to sync the pool with the parent thread)

tx.send(1).expect("channel will be there waiting for the pool");
});
}

assert_eq!(rx.iter().take(n_jobs).fold(0, |a, b| a + b), 8);
```

* **Use sync module to synchronize your pool**

```rust
let njobs = 20;
let nworkers = 3;
let pool = pool::WorkerPool::new(nworkers);
let atomic = Arc::new(AtomicUsize::new(0));
let wg = WaitGroup::default();

// send the jobs to the pool
for _ in 0..njobs {
let wg = wg.clone();
let atomic = atomic.clone();
pool.execute(move || {
atomic.fetch_add(1, Ordering::Relaxed);
drop(wg);
});
}

// wait for the pool finnishes
wg.wait();
assert_eq!(njobs, atomic.load(Ordering::Relaxed));
```