You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
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() }() }
|