Middle+
29
Live coding: семафор — как работает и реализация на основе буферизированного канала.
Companies where asked
Веро Трейс
Answer from AI
sobes.tech AI
Семафор — это механизм синхронизации, который ограничивает количество одновременно выполняющихся операций или потоков.
В Go семафор можно реализовать с помощью буферизированного канала, где размер буфера соответствует максимальному количеству разрешённых одновременных операций.
Принцип работы:
- Перед началом операции горутина пытается отправить значение в канал — если канал заполнен, горутина блокируется.
- После завершения операции горутина читает значение из канала, освобождая место для других.
Пример реализации семафора на Go:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// Создаем семафор с максимальной пропускной способностью 3
semaphore := make(chan struct{}, 3)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
// Захватываем семафор
semaphore <- struct{}{}
fmt.Printf("Горутина %d начала работу\n", id)
time.Sleep(1 * time.Second) // имитация работы
fmt.Printf("Горутина %d завершила работу\n", id)
// Освобождаем семафор
<-semaphore
}(i)
}
wg.Wait()
}
В этом примере не более 3 горутин одновременно выполняют работу, остальные ждут освобождения места в семафоре.