Limitmap is Go library providing map of semaphores to limit concurrency against some string keys.
- Blocking
Acquire/Release
interface. - Separate limit value for each key.
- Code errors such as
Release
beforeAcquire
result inpanic()
. - Semaphore is implemented using
sync.Cond
. - Map access is guarded by shared
sync.Mutex
.
Example use cases:
- Limit simultaneous connections to services.
- Limit IO per storage device.
limits := limitmap.NewLimitMap()
process := func(url *url.URL) {
// At most 2 concurrent requests to each host.
limits.Acquire(url.Host, 2)
defer limits.Release(url.Host)
defer limits.Release("all")
r, err := http.Get(url.String())
// do something with response/error
}
for url := range urlChan {
// Limit max goroutines only as safety net againist exhausting computing resources, this number may seem big.
limits.Acquire("all", 200000)
go process(url)
}
limits.Wait() // until all tasks finished
go get -u github.com/temoto/limitmap