// Tokens for controlling concurrency package pacer // TokenDispenser is for controlling concurrency type TokenDispenser struct { tokens chan struct{} } // NewTokenDispenser makes a pool of n tokens func NewTokenDispenser(n int) *TokenDispenser { td := &TokenDispenser{ tokens: make(chan struct{}, n), } // Fill up the upload tokens for i := 0; i < n; i++ { td.tokens <- struct{}{} } return td } // Get gets a token from the pool - don't forget to return it with Put func (td *TokenDispenser) Get() { <-td.tokens return } // Put returns a token func (td *TokenDispenser) Put() { td.tokens <- struct{}{} }