[![GoDoc](http://godoc.org/github.com/ChimeraCoder/tokenbucket?status.png)](http://godoc.org/github.com/ChimeraCoder/tokenbucket)
tokenbucket
====================
This package provides an implementation of [Token bucket](https://en.wikipedia.org/wiki/Token_bucket) scheduling in Go. It is useful for implementing rate-limiting, traffic shaping, or other sorts of scheduling that depend on bandwidth constraints.
Example
------------
To create a new bucket, specify a capacity (how many tokens can be stored "in the bank"), and a rate (how often a new token is added).
````go
// Create a new bucket
// Allow a new action every 5 seconds, with a maximum of 3 "in the bank"
bucket := tokenbucket.NewBucket(3, 5 * time.Second)
````
This bucket should be shared between any functions that share the same constraints. (These functions may or may not run in separate goroutines).
Anytime a regulated action is performed, spend a token.
````go
// To perform a regulated action, we must spend a token
// RegulatedAction will not be performed until the bucket contains enough tokens
<-bucket.SpendToken(1)
RegulatedAction()
````
`SpendToken` returns immediately. Reading from the channel that it returns will block until the action has "permission" to continue (ie, until there are enough tokens in the bucket).
(The channel that `SpendToken` returns is of type `error`. For now, the value will always be `nil`, so it can be ignored.)
####License
`tokenbucket` is free software provided under version 3 of the LGPL license.
Software that uses `tokenbucket` may be released under *any* license, as long as the source code for `tokenbucket` (including any modifications) are made available under the LGPLv3 license.
You do not need to release the rest of the software under the LGPL, or any free/open-source license, for that matter (though we would encourage you to do so!).