42 lines
705 B
Go
42 lines
705 B
Go
package utils
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// DefaultMaxWorkers 默认并发数
|
|
const DefaultMaxWorkers = 32
|
|
|
|
// WorkerPool 并发执行一批任务。
|
|
func WorkerPool(tasks []interface{}, taskFunc func(interface{}), maxWorkers ...int) {
|
|
if len(tasks) == 0 {
|
|
return
|
|
}
|
|
|
|
workers := DefaultMaxWorkers
|
|
if len(maxWorkers) > 0 && maxWorkers[0] > 0 {
|
|
workers = maxWorkers[0]
|
|
}
|
|
if workers > len(tasks) {
|
|
workers = len(tasks)
|
|
}
|
|
|
|
jobs := make(chan interface{}, len(tasks))
|
|
var wg sync.WaitGroup
|
|
for i := 0; i < workers; i++ {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
for task := range jobs {
|
|
taskFunc(task)
|
|
}
|
|
}()
|
|
}
|
|
for _, task := range tasks {
|
|
jobs <- task
|
|
}
|
|
|
|
close(jobs)
|
|
wg.Wait()
|
|
}
|