Буферизованный шаблон блокировки в Go
В Go буферизованный канал позволяет продолжать связь без блокировки до тех пор, пока его буфер не заполнится. Однако существует ли аналогичный шаблон для блокировок буферизации, которые ограничивают доступ к ресурсу определенному количеству клиентов?
Примитивом для управления одновременным доступом к ресурсу является семафор. Семафор можно легко реализовать с использованием буферизованного канала.
Вот пример:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks if 4 other concurrent invocations of f are running. semaphoreВ этом примере семафор с буфером размером 4 создается с помощью семафора := make(chan struct{}, 4). Функция f() пытается получить блокировку, отправляя в канал пустую структуру. Если буфер канала заполнен (т. е. 4 одновременных экземпляра f() уже запущены), вызов семафора
Когда функция завершит свою работу задача, она снимает блокировку, извлекая из канала пустую структуру (-
Этот шаблон обеспечивает удобный способ ограничить доступ к общему ресурсу определенным количеством одновременных клиентов, предотвращая потенциальные проблемы конкуренции за ресурсы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3