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?")
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{})
// 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 all workers
Stop()
}
Pool implements worker pool
Click to show internal directories.
Click to hide internal directories.