Sobes.tech
Назад к вопросам
Senior
4

Расскажи про паттерн Semaphore?

Компании, где спрашивали
sber tech

Ответ от нейросети

sobes.tech AI

Паттерн Semaphore (семафор) — это механизм синхронизации, который ограничивает количество одновременно выполняющихся операций или доступ к ресурсу.

В Go семафор можно реализовать с помощью канала, ограничивая количество горутин, которые могут одновременно выполнять критическую секцию.

Пример простого семафора на Go:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	sem := make(chan struct{}, 3) // семафор с пропускной способностью 3
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			sem <- struct{}{} // захват семафора
			fmt.Printf("Горутина %d начала работу\n", id)
			time.Sleep(1 * time.Second) // имитация работы
			fmt.Printf("Горутина %d закончила работу\n", id)
			<-sem // освобождение семафора
		}(i)
	}

	wg.Wait()
}

В этом примере одновременно не более трёх горутин могут выполнять работу. Семафор полезен для ограничения параллелизма, например, при работе с ограниченными ресурсами (соединениями, файлами и т.д.).