mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-12-28 11:57:54 +08:00
41 lines
895 B
Go
41 lines
895 B
Go
|
package util
|
||
|
|
||
|
// initial version comes from https://github.com/korovkin/limiter/blob/master/limiter.go
|
||
|
|
||
|
// LimitedConcurrentExecutor object
|
||
|
type LimitedConcurrentExecutor struct {
|
||
|
limit int
|
||
|
tokenChan chan int
|
||
|
}
|
||
|
|
||
|
func NewLimitedConcurrentExecutor(limit int) *LimitedConcurrentExecutor {
|
||
|
|
||
|
// allocate a limiter instance
|
||
|
c := &LimitedConcurrentExecutor{
|
||
|
limit: limit,
|
||
|
tokenChan: make(chan int, limit),
|
||
|
}
|
||
|
|
||
|
// allocate the tokenChan:
|
||
|
for i := 0; i < c.limit; i++ {
|
||
|
c.tokenChan <- i
|
||
|
}
|
||
|
|
||
|
return c
|
||
|
}
|
||
|
|
||
|
// Execute adds a function to the execution queue.
|
||
|
// if num of go routines allocated by this instance is < limit
|
||
|
// launch a new go routine to execute job
|
||
|
// else wait until a go routine becomes available
|
||
|
func (c *LimitedConcurrentExecutor) Execute(job func()) {
|
||
|
token := <-c.tokenChan
|
||
|
go func() {
|
||
|
defer func() {
|
||
|
c.tokenChan <- token
|
||
|
}()
|
||
|
// run the job
|
||
|
job()
|
||
|
}()
|
||
|
}
|