Documentation
¶
Overview ¶
Package workerpool provides simple async workers
Example ¶
package main
import (
"fmt"
"sync"
workerpool "github.com/vardius/worker-pool"
)
func main() {
var wg sync.WaitGroup
poolSize := 1
jobsAmount := 3
workersAmount := 2
// create new pool
pool := workerpool.New(poolSize)
out := make(chan int, jobsAmount)
pool.Start(workersAmount, func(i int) {
defer wg.Done()
out <- i
})
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"
)
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()
pool.Start(workersAmount, func(i int, out chan<- int) { out <- i })
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"
)
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)
}
// start worker
pool.Start(workersAmount, func(s string) {
defer wg.Done()
defer fmt.Println("job " + s + " is done !")
fmt.Println("job " + s + " is running ..")
})
// 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{})
// Start given number of workers that will take jobs from a queue
Start(maxWorkers int, fn interface{}) error
// Stop all workers
Stop()
}
Pool implements worker pool
Click to show internal directories.
Click to hide internal directories.