Awesome
Overview
AsyncJob is an asynchronous job manager with light code, clear and speed. I hope so ! 😬
Features
- AsyncJob is a simple asynchronous job manager.
- Full code coverage
- Async queue
- Define the number of asynchronous tasks (default: runtime.NumCPU())
- Handling of managed and unmanaged errors
- Provide a simple ETA
- Full code description
Usage
package main
import (
"github.com/lab210-dev/async-job"
"log"
)
func main() {
// Create a new AsyncJob
asj := asyncjob.New[string]()
// Set the number of asynchronous tasks (default: runtime.NumCPU())
asj.SetWorkers(2)
// Listen to the progress status
asj.OnProgress(func(progress asyncjob.Progress) {
log.Printf("Progress: %s\n", progress.String())
})
// Run all jobs
err := asj.Run(func(job asyncjob.Job[string]) error {
// receive the job in job data function
// if err return or panic, the job will be marked as failed and all progress will be canceled
return nil
}, []string{"Hello", "World"})
// if a job returns an error, it stops the process
if err != nil {
log.Fatal(err)
}
}
💡 For better performance
Using a modulo to reduce the eta display (fast example)
package main
import (
"github.com/lab210-dev/async-job"
"log"
"time"
)
func main() {
// create slice of jobs
var list []time.Duration
for i := 1; i <= 100; i++ {
list = append(list, time.Duration(1)*time.Millisecond)
}
err := asyncjob.New[time.Duration]().
SetWorkers(2).
OnProgress(func(progress asyncjob.Progress) {
// Eta will be displayed every 10 jobs
if progress.Current()%10 != 0 {
return
}
// print the eta
log.Printf("Progress: %s\n", progress.String())
}).
Run(func(job asyncjob.Job[time.Duration]) error {
// slow down the job
time.Sleep(job.Data())
return nil
}, list)
// if a job returns an error, it stops the process
if err != nil {
log.Fatal(err)
}
}
🤝 Contributions
Contributors to the package are encouraged to help improve the code.