Чтобы ограничить использование программой ресурса, такого как память, пусть горутины синхронизируют использование этого ресурса с помощью буферизованного канала (т. е. используют канал как семафор):
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 // Блокировать до тех пор,
// пока не появится возможность обработать запрос.
req := <-queue
go handle(req) // Не дожидаемся завершения handle.
}
}
func handle(r *Request) {
process(r) // Может занять много времени
// и потреблять много памяти или ЦП
<-sem // Готово; разрешить запуск следующего запроса.
}
Читайте также:
Комментариев нет:
Отправить комментарий