本文是阅读GoFrame内grpool包的理解
大致理解
type Pool
struct {
limit
int
count
*gtype
.Int
list
*glist
.List
closed
*gtype
.Bool
}
两种工作方式,一种是链式操作,另一种非链式操作,这里只讲链式操作
第一步初始化一个池子,可以设置池子的容量,默认不限制
func New(limit
...int) *Pool
{
p
:= &Pool
{
limit
: -1,
count
: gtype
.NewInt(),
list
: glist
.New(true),
closed
: gtype
.NewBool(),
}
if len(limit
) > 0 && limit
[0] > 0 {
p
.limit
= limit
[0]
}
return p
}
添加任务到池中
func (p
*Pool
) Add(f
func()) error {
for p
.closed
.Val() {
return errors
.New("pool closed")
}
p
.list
.PushFront(f
)
var n
int
for {
n
= p
.count
.Val()
if p
.limit
!= -1 && n
>= p
.limit
{
return nil
}
if p
.count
.Cas(n
, n
+1) {
break
}
}
p
.fork()
return nil
}
fork
func (p
*Pool
) fork() {
go func() {
defer p
.count
.Add(-1)
var job
interface{}
for !p
.closed
.Val() {
if job
= p
.list
.PopBack(); job
!= nil {
job
.(func())()
} else {
return
}
}
}()
}
好了,一个协程池的最主要内容就讲完了,其他的我就不讲了