强大的gorouting 和channle可以很轻松的实现一个 workqueue 来并行的执行任务,思路:可以将将要执行的任务放到一channel, 然后创建多个go routing 去chnanel 取任务执行, 可以看下是不是要比java方便好多。
package main
import (
"fmt"
"sync"
)
type DoWorkPieceFunc func(piece int)
// Parallelize is a very simple framework that allow for parallelizing
// N independent pieces of work.
func Parallelize(workers, pieces int, doWorkPiece DoWorkPieceFunc) {
toProcess := make(chan int, pieces)
for i := 0; i < pieces; i++ {
toProcess <- i
}
close(toProcess)
wg := sync.WaitGroup{}
wg.Add(workers)
for i := 0; i < workers; i++ {
go func(i int) {
defer wg.Done()
fmt.Printf("worker %v is working\n", i)
for piece := range toProcess {
fmt.Printf("to be done no: %v\n", len(toProcess))
doWorkPiece(piece)
}
}(i)
}
wg.Wait()
}
func main() {
processNode := func(i int) {
fmt.Printf("process i:%v\n", i)
}
Parallelize(16, 100, processNode)
}
~