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.
		
		
		
		
		
			
		
			
				
					
					
						
							40 lines
						
					
					
						
							895 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							40 lines
						
					
					
						
							895 B
						
					
					
				
								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()
							 | 
						|
									}()
							 | 
						|
								}
							 |