среда, 6 октября 2021 г.

Ограничение использования ресурсов для программы в Golang

Чтобы ограничить использование программой ресурса, такого как память, пусть горутины синхронизируют использование этого ресурса с помощью буферизованного канала (т. е. используют канал как семафор):

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      // Готово; разрешить запуск следующего запроса.
}


Читайте также:


Комментариев нет:

Отправить комментарий