BoundingResourceUse

nathany edited this page Dec 10, 2014 · 3 revisions

Bounding resource use

To bound a program's use of a limited resource - like memory - have goroutines synchronize their use of that resource using a buffered channel (i.e., use the channel as a semaphore):

const (
	AvailableMemory         = 10 << 20 // 10 MB
	AverageMemoryPerRequest = 10 << 10 // 10 KB
	MaxOutstanding          = AvailableMemory / AverageMemoryPerRequest
)

var sem = make(chan int, MaxOutstanding)

func Serve(queue chan *Request) {
	for {
		sem <- 1 // Block until there's capacity to process a request.
		req := <-queue
		go handle(req) // Don't wait for handle to finish.
	}
}

func handle(r *Request) {
	process(r) // May take a long time & use a lot of memory or CPU
	<-sem      // Done; enable next request to run.
}

References

Effective Go's discussion of channels: http://golang.org/doc/effective_go.html#channels

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.