Documentation
¶
Overview ¶
Package taskpool 非阻塞协程池,协程数量可动态增长,可配置最大协程并发数量,可手动释放空闲的协程
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var ErrTaskPool = errors.New("naza.taskpool: fxxk")
Functions ¶
func KillIdleWorkers ¶
func KillIdleWorkers()
Types ¶
type DisposeType ¶
type DisposeType int
DisposeType
任务分为3种状态:
1. 已添加(到Pool中)),正在执行 2. 已添加,但是还没有被执行 3. 还没有添加
DisposeTypeAsap: 1会执行,2和3不会 DisposeTypeRunAllBlockTask: 1和2会执行,3不会
const ( DisposeTypeAsap DisposeType = iota + 1 DisposeTypeRunAllBlockTask )
type Pool ¶
type Pool interface {
// Go
//
// 向池内放入任务
//
// 非阻塞函数,不会等待task执行
//
// 注意一种场景,往Pool添加了一堆task任务,但是还没有执行到,现在想取消没有执行的任务。
// 这种情况业务层可以在task实现中增加标志位,通过标志位决定是否执行任务。
//
Go(task TaskFn, param ...interface{})
// GetCurrentStatus 获取当前的状态,注意,只是一个瞬时值
GetCurrentStatus() Status
// KillIdleWorkers 关闭池内所有的空闲协程
KillIdleWorkers()
// Dispose 完全释放池内资源,包括所有协程
Dispose(t DisposeType)
}
func NewPool ¶
Example ¶
并发计算0+1+2+...+1000 演示怎么向协程池中添加带参数的函数任务
package main
import (
"fmt"
"sync"
"sync/atomic"
"github.com/qmcloud/admin-common/utils/taskpool"
)
func main() {
pool, _ := taskpool.NewPool(func(option *taskpool.Option) {
// 限制最大并发数
option.MaxWorkerNum = 16
})
var sum int32
var wg sync.WaitGroup
n := 1000
wg.Add(n)
for i := 0; i < n; i++ {
pool.Go(func(param ...interface{}) {
ii := param[0].(int)
atomic.AddInt32(&sum, int32(ii))
wg.Done()
}, i)
}
wg.Wait()
fmt.Println(sum)
}
Output: 499500
Click to show internal directories.
Click to hide internal directories.