1 Commits

Author SHA1 Message Date
cuddle-please
0e3d7afd52 chore(release): 0.0.1
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2025-07-01 13:39:41 +00:00
8 changed files with 15 additions and 59 deletions

View File

@@ -6,12 +6,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.0.4] - 2025-08-08
### Other
- Configure Renovate (#3)
Add renovate.json
## [0.0.1] - 2025-07-01 ## [0.0.1] - 2025-07-01
### Added ### Added

2
Cargo.lock generated
View File

@@ -88,7 +88,7 @@ dependencies = [
[[package]] [[package]]
name = "noworkers" name = "noworkers"
version = "0.0.1" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"tokio", "tokio",

View File

@@ -3,8 +3,7 @@ members = ["crates/*"]
resolver = "2" resolver = "2"
[workspace.package] [workspace.package]
version = "0.0.4" version = "0.0.1"
license = "MIT"
[workspace.dependencies] [workspace.dependencies]
noworkers = { path = "crates/noworkers" } noworkers = { path = "crates/noworkers" }

View File

@@ -5,12 +5,6 @@ Manage concurrent tasks with optional limits, cancellation, and first-error prop
Inpired by golang (errgroups) Inpired by golang (errgroups)
## Disclaimer
The library is still new, and as such the API is subject to change, I don't expect changes to the add and wait functions, but the rest may change. I might also move to custom error types, and or removing the tokio_utils entirely to slim down the package. It shouldn't affect the user too much however.
The crate is in production, and has seen extensive use
## Features ## Features
- **Unlimited or bounded concurrency** via `with_limit(usize)`. - **Unlimited or bounded concurrency** via `with_limit(usize)`.
@@ -31,39 +25,33 @@ Then in your code:
```rust ```rust
use noworkers::Workers; use noworkers::Workers;
use tokio_util::sync::CancellationToken;
``` ```
## Quick Example ## Quick Example
```rust ```rust,no_run
use noworkers::Workers; use noworkers::Workers;
use tokio_util::sync::CancellationToken;
#[tokio::main] #[tokio::main]
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
// Create a worker group with up to 5 concurrent tasks // Create a worker group with up to 5 concurrent tasks
let mut workers = Workers::new(); let mut workers = Workers::new();
// Limit amount of concurrent workers workers
workers.with_limit(5); .with_limit(5)
.with_cancel(&CancellationToken::new());
// Adds cancellation signal
workers.with_cancel_task(async move {
// send cancellation to tasks after 60 seconds
tokio::time::sleep(std::time::Duration::from_secs(60)).await
});
// Spawn 10 async jobs // Spawn 10 async jobs
for i in 0..10 { for i in 0..10 {
// Work is done immediatley, so this will wait in two batches of 1 seconds each (because of limit)
workers.add(move |cancel_token| async move { workers.add(move |cancel_token| async move {
// optional tokio::select, if you use cancellation for your tasks, if not just do your work // Respect cancellation, or not, if you don't care about blocking forever
tokio::select! { tokio::select! {
// Do work, in this case just sleep
_ = tokio::time::sleep(tokio::time::Duration::from_secs(1)) => { _ = tokio::time::sleep(tokio::time::Duration::from_secs(1)) => {
println!("Job {i} done"); println!("Job {i} done");
Ok(()) Ok(())
} }
// If we receive cancel we close
_ = cancel_token.cancelled() => { _ = cancel_token.cancelled() => {
println!("Job {i} cancelled"); println!("Job {i} cancelled");
Ok(()) Ok(())
@@ -107,9 +95,5 @@ async fn main() -> anyhow::Result<()> {
Dual-licensed under **MIT** or **Apache-2.0**. Dual-licensed under **MIT** or **Apache-2.0**.
See [LICENSE-MIT](LICENSE-MIT) and [LICENSE-APACHE](LICENSE-APACHE) for details. See [LICENSE-MIT](LICENSE-MIT) and [LICENSE-APACHE](LICENSE-APACHE) for details.
```
## Contribute
Simply create an issue here or pr https://github.com/kjuulh/noworkers.git, development happens publicly at: https://git.kjuulh.io/kjuulh/noworkers.

View File

@@ -3,8 +3,8 @@ name = "noworkers"
edition = "2024" edition = "2024"
readme = "../../README.md" readme = "../../README.md"
version.workspace = true version.workspace = true
license.workspace = true license = "MIT or APACHE"
repository = "https://git.kjuulh.io/kjuulh/noworkers" repository = "https://git.front.kjuulh.io/kjuulh/noworkers"
authors = ["kjuulh <contact@kasperhermansen.com>"] authors = ["kjuulh <contact@kasperhermansen.com>"]
description = "A small asyncronous worker pool manages thread pool limiting, cancellation and error propogation, inspired by golangs errgroup (requires tokio)" description = "A small asyncronous worker pool manages thread pool limiting, cancellation and error propogation, inspired by golangs errgroup (requires tokio)"

View File

@@ -3,24 +3,6 @@ use std::{future::Future, sync::Arc};
use tokio::{sync::Mutex, task::JoinHandle}; use tokio::{sync::Mutex, task::JoinHandle};
use tokio_util::sync::CancellationToken; use tokio_util::sync::CancellationToken;
pub mod extensions {
use crate::Workers;
pub trait WithSysLimitCpus {
fn with_limit_to_system_cpus(&mut self) -> &mut Self;
}
impl WithSysLimitCpus for Workers {
fn with_limit_to_system_cpus(&mut self) -> &mut Self {
self.with_limit(
std::thread::available_parallelism()
.expect("to be able to get system cpu info")
.into(),
)
}
}
}
type ErrChan = Arc< type ErrChan = Arc<
Mutex<( Mutex<(
Option<tokio::sync::oneshot::Sender<anyhow::Error>>, Option<tokio::sync::oneshot::Sender<anyhow::Error>>,

View File

@@ -1,6 +1,6 @@
# yaml-language-server: $schema=https://git.kjuulh.io/kjuulh/cuddle/raw/branch/main/schemas/base.json # yaml-language-server: $schema=https://git.front.kjuulh.io/kjuulh/cuddle/raw/branch/main/schemas/base.json
base: "git@git.kjuulh.io:kjuulh/cuddle-rust-lib-plan.git" base: "git@git.front.kjuulh.io:kjuulh/cuddle-rust-lib-plan.git"
vars: vars:
service: "noworkers" service: "noworkers"
@@ -12,6 +12,6 @@ please:
repository: "noworkers" repository: "noworkers"
branch: main branch: main
settings: settings:
api_url: "https://git.kjuulh.io" api_url: "https://git.front.kjuulh.io"
actions: actions:
rust: rust:

View File

@@ -1,3 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}