Back to questions
Junior — Middle
90
Можно ли завершить работу одного канала из нескольких горутин одновременно?
Answer from AI
sobes.tech AI
Нет, завершить (закрыть) один и тот же канал из нескольких горутин одновременно нельзя. В Go канал должен быть закрыт ровно один раз, и обычно это делает та горутина, которая отвечает за отправку данных в канал.
Если несколько горутин попытаются закрыть канал, это приведёт к панике (runtime panic).
Правильный подход:
- Определить единственную горутину, ответственную за закрытие канала.
- Использовать дополнительные механизмы синхронизации (например, sync.Once), чтобы гарантировать, что закрытие произойдёт только один раз.
Пример с sync.Once:
var once sync.Once
func closeChannel(ch chan int) {
once.Do(func() {
close(ch)
})
}
Таким образом, даже если несколько горутин вызовут closeChannel, канал закроется только один раз.