Sobes.tech
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 горутин одновременно выполняют работу, остальные ждут освобождения места в семафоре.