Documentation ยถ
Overview ยถ
Package workerpool provides simple async workers
Example ยถ
package main import ( "fmt" "sync" workerpool "github.com/vardius/worker-pool/v2" ) func main() { var wg sync.WaitGroup poolSize := 1 jobsAmount := 3 workersAmount := 2 // create new pool pool := workerpool.New(poolSize) out := make(chan int, jobsAmount) worker := func(i int) { defer wg.Done() out <- i } for i := 1; i <= workersAmount; i++ { if err := pool.AddWorker(worker); err != nil { panic(err) } } wg.Add(jobsAmount) for i := 0; i < jobsAmount; i++ { pool.Delegate(i) } go func() { // stop all workers after jobs are done wg.Wait() close(out) pool.Stop() }() sum := 0 for n := range out { sum += n } fmt.Println(sum) }
Output: 3
Example (Second) ยถ
package main import ( "fmt" workerpool "github.com/vardius/worker-pool/v2" ) func main() { poolSize := 2 jobsAmount := 8 workersAmount := 3 ch := make(chan int, jobsAmount) defer close(ch) // create new pool pool := workerpool.New(poolSize) defer pool.Stop() worker := func(i int, out chan<- int) { out <- i } for i := 1; i <= workersAmount; i++ { if err := pool.AddWorker(worker); err != nil { panic(err) } } go func() { for n := 0; n < jobsAmount; n++ { pool.Delegate(n, ch) } }() var sum = 0 for sum < jobsAmount { select { case <-ch: sum++ } } fmt.Println(sum) }
Output: 8
Example (Third) ยถ
package main import ( "fmt" "strconv" "sync" workerpool "github.com/vardius/worker-pool/v2" ) func main() { poolSize := 2 jobsAmount := 8 workersAmount := 3 var wg sync.WaitGroup wg.Add(jobsAmount) // allocate queue pool := workerpool.New(poolSize) // moc arg argx := make([]string, jobsAmount) for j := 0; j < jobsAmount; j++ { argx[j] = "_" + strconv.Itoa(j) + "_" } // assign job for i := 0; i < jobsAmount; i++ { go func(i int) { pool.Delegate(argx[i]) }(i) } worker := func(s string) { defer wg.Done() defer fmt.Println("job " + s + " is done !") fmt.Println("job " + s + " is running ..") } // start workers for i := 1; i <= workersAmount; i++ { if err := pool.AddWorker(worker); err != nil { panic(err) } } // clean up wg.Wait() pool.Stop() // fmt.Println("# hi: ok?")
Output:
Index ยถ
Examples ยถ
Constants ยถ
This section is empty.
Variables ยถ
This section is empty.
Functions ยถ
This section is empty.
Types ยถ
type Pool ยถ
type Pool interface { // Delegate job to a workers // will block if channel is full, you might want to wrap it with goroutine to avoid it // will panic if called after Stop() Delegate(args ...interface{}) error // AddWorker adds worker to the pool AddWorker(fn interface{}) error // RemoveWorker removes worker from the pool RemoveWorker(fn interface{}) error // WorkersNum returns number of workers in the pool WorkersNum() int // Stop removes all workers workers // to resume work add them again Stop() }
Pool implements worker pool
Click to show internal directories.
Click to hide internal directories.