Как узнать когда горутины закончили запись, чтобы закрыть канал?

[Обновил ссылку на код, забыл wg.Add сделать для последней горутины]
Всем привет, мне необходимо написать функцию для параллельного выполнения заданий в n параллельных горутинах:
- количество создаваемых горутин не должно зависеть от числа заданий, т.е. функция должна запусать n горутин для параллельно обработки заданий и, возможно, еще несколько вспомогательных горутин;
- функция должна останавливать свою работу, если произошло m ошибок;
- после завершения работы функции (успешного или из-за превышения m) не должно оставаться работающих горутин;
- если задачи работают без ошибок, то выполнятся len(tasks) задач (т.е. все задачи);
- если в первых m задачах происходят ошибки, то всего выполнится не более n+m задач.

мой код https://goplay.tools/snippet/ZEngzDhQB_W
код теста https://goplay.tools/snippet/2iauUBIAzA0

У меня происходит ожидание в канал errorsCh, по идее, мне нужно его закрыть, но если я закрываю его на строке 65 как
case <-done:
close(errors)
return

то я всегда получаю панику panic: close of closed channel и это логично, потому что какая-та горутина еще не успеет завершиться и попытается снова записать в error канал, но я запутался, как мне и где его правильно закрыть?
  • Вопрос задан
  • 691 просмотр
Пригласить эксперта
Ответы на вопрос 2
@falconandy
Примерно так: https://goplay.tools/snippet/TciyGAE8dyn
Ответ написан
Комментировать
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
Предлагаю не злоупотреблять каналами:
https://goplay.tools/snippet/a91nAx2wevG

Ваш тест из вопроса проходит. Корректность теста не смотрел :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы