Use a buffered channel to limit the number of active goroutines without needing to wait for all active goroutines to finish