Найти тему
Crazy Coder

Каналы в Go

Оглавление

В Go, канал обычно закрывается отправляющей стороной, а не получающей. Закрытие канала со стороны читателя не является обычной практикой, так как это может привести к панике при попытке отправить данные в закрытый канал.

Схема "много писателей - один читатель" может быть полезна в следующих случаях:
1. **Сбор данных**: Если несколько горутин генерируют данные, которые должны быть обработаны централизованно.
2. **Ограничение ресурсов**: Когда есть ресурс, который может быть использован только одной горутиной одновременно.
3. **Синхронизация**: Для синхронизации работы нескольких горутин, отправляющих данные одной горутине-обработчику.
4. **Упрощение конструкции**: Уменьшение сложности обработки, когда все данные собираются и обрабатываются в одном месте.

Аксиомы каналов Go

Отправка в nil канал блокируется навсегда.
Чтение из nil канала блокируется навсегда.
Отправка в закрытый канал вызывает панику.
Чтение из закрытого канала возвращает нулевое значение.

Семафор - реализация на каналах


Используется для:

- Ограничение доступа к общим ресурсам.

- Управление параллельным выполнением задач.

- Реализация паттернов синхронизации.
Этот код реализует семафор на языке Go. Семафоры используются для ограничения количества горутин, которые могут одновременно получить доступ к ресурсу или выполнить определенную задачу.

type semaphore struct {
semC chan struct{}
}
func New(maxConcurrency int) Semaphore {
return &semaphore{
semC: make(chan struct{}, maxConcurrency),
}
}
func (s *semaphore) Acquire() {
s.semC <- struct{}{}
}
func (s *semaphore) Release() {
<-s.semC
}

/*
- `New(maxConcurrency int)`: создает новый семафор с максимальной параллельностью `maxConcurrency`.
- `Acquire()`: захватывает слот в семафоре. Если все слоты заняты, горутина блокируется.
- `Release()`: освобождает слот, делая его доступным для других горутин.
*/