mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
// Copyright 2017 gf Author(https://gitee.com/johng/gf). All Rights Reserved.
|
||
//
|
||
// This Source Code Form is subject to the terms of the MIT License.
|
||
// If a copy of the MIT was not distributed with this file,
|
||
// You can obtain one at https://gitee.com/johng/gf.
|
||
|
||
// Goroutine池.
|
||
// 用于goroutine复用,提升异步操作执行效率.
|
||
package groutine
|
||
|
||
import (
|
||
"math"
|
||
"sync"
|
||
"gitee.com/johng/gf/g/container/gset"
|
||
"gitee.com/johng/gf/g/container/glist"
|
||
)
|
||
|
||
// goroutine池对象
|
||
type Pool struct {
|
||
jobs *gset.InterfaceSet // 当前任务对象(*PoolJob)
|
||
queue *glist.SafeList // 空闲任务队列(*PoolJob)
|
||
funcs *glist.SafeList // 待处理任务操作队列
|
||
events chan struct{} // 任务操作处理事件(用于任务事件通知)
|
||
}
|
||
|
||
// goroutine任务
|
||
type PoolJob struct {
|
||
mu sync.RWMutex
|
||
job chan func() // 当前任务(当为nil时表示关闭)
|
||
pool *Pool // 所属池
|
||
}
|
||
|
||
// 创建goroutine池管理对象
|
||
func New() *Pool {
|
||
p := &Pool {
|
||
jobs : gset.NewInterfaceSet(),
|
||
queue : glist.NewSafeList(),
|
||
funcs : glist.NewSafeList(),
|
||
events : make(chan struct{}, math.MaxUint32),
|
||
}
|
||
p.loop()
|
||
return p
|
||
}
|
||
|
||
// 添加异步任务
|
||
func (p *Pool) Add(f func()) {
|
||
p.funcs.PushBack(f)
|
||
p.events <- struct{}{}
|
||
}
|
||
|
||
// 关闭池,所有的任务将会停止,此后继续添加的任务将不会被执行
|
||
func (p *Pool) Close() {
|
||
p.Add(nil)
|
||
p.jobs.Iterator(func(v interface{}){
|
||
v.(*PoolJob).stop()
|
||
})
|
||
} |