Easy limiting of concurrency in Go
A common occurrence in Go is wanting to do a lot of something, but with some governor on concurrency, there are lots of patterns for this, but Paul Smith had a really clever one…
SOURCE: https://pauladamsmith.com/blog/2016/04/max-clients-go-net-http.html
I can’t even remember how I stumbled onto Paul’s post – but it is just a killer three line way to limit concurrency.
func main() {
sema := make(chan struct{}, 10) // 10 is max concurrency
go func() {
sema <- struct{}{} // mark one as running (will block when full)
defer func() { <-sema } // mark one as completed
// Do something, but you only want max 10 of...
}()
}