go
параллелизм очень мощный. Координационный параллелизм очень жесткий . К счастью, стандартная библиотека go
имеет много инструментов, чтобы помочь с этим. Возможно, вам следует ознакомиться с пакетом context
.
context.Context
используйте готовые каналы под крышками (аналогично вашему stopChan
), но есть другие механизмы, такие как цепочка отмены. Они также используются в стандартной библиотеке go
для запросов http, базы данных и других блокирующих типов.
Как упоминал @JimB, обычно sync.Once
редко требуется при координации производителя / потребителя. chan
с и sync.WaitGroup
с обычно достаточно.
В любом случае, вот исправление для вашего кода, используя context.Context
:
https://play.golang.org/p/QwszE_bW41X