Sobes.tech
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, канал закроется только один раз.