[Обновил ссылку на код, забыл 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 канал, но я запутался, как мне и где его правильно закрыть?