54 lines
675 B
Go
54 lines
675 B
Go
|
package analytics
|
||
|
|
||
|
import "sync"
|
||
|
|
||
|
type executor struct {
|
||
|
queue chan func()
|
||
|
mutex sync.Mutex
|
||
|
size int
|
||
|
cap int
|
||
|
}
|
||
|
|
||
|
func newExecutor(cap int) *executor {
|
||
|
e := &executor{
|
||
|
queue: make(chan func(), 1),
|
||
|
cap: cap,
|
||
|
}
|
||
|
go e.loop()
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
func (e *executor) do(task func()) (ok bool) {
|
||
|
e.mutex.Lock()
|
||
|
|
||
|
if e.size != e.cap {
|
||
|
e.queue <- task
|
||
|
e.size++
|
||
|
ok = true
|
||
|
}
|
||
|
|
||
|
e.mutex.Unlock()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (e *executor) close() {
|
||
|
close(e.queue)
|
||
|
}
|
||
|
|
||
|
func (e *executor) loop() {
|
||
|
for task := range e.queue {
|
||
|
go e.run(task)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (e *executor) run(task func()) {
|
||
|
defer e.done()
|
||
|
task()
|
||
|
}
|
||
|
|
||
|
func (e *executor) done() {
|
||
|
e.mutex.Lock()
|
||
|
e.size--
|
||
|
e.mutex.Unlock()
|
||
|
}
|