В 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()`: освобождает слот, делая его доступным для других горутин.
*/