Запущено 20 горутин такой функции.
func (w *Writer) Work(ctx context.Context) {
// start
f, err := os.Create("./tmp/" + filename)
if err != nil {
panic(err)
}
defer f.Close()
// Запись шапки в файл
for {
select {
case <-ctx.Done():
// Как выполнить тут работу в конце работы горутины? сейчас не работает
case it := <-*w.Channel:
// Запись элементов в файл
}
}
// Или может тут выполнить работу в конце работы горутины ? тоже не работает
}
В цикле я каждой из них (через канал для каждой, 20 горутин — значит 20 каналов) отправляю сообщения, а каждая пишет в свой файл
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer func() {
fmt.Println("Finish items loading!") // это сообщеие выводится
cancel()
}()
// тут стартанули нашу пачку горутин
for {
res, err := esScroller.Do(ctx)
for _, hit := range res.Hits.Hits {
// ... билд item
// отправляем во все каналы элемент
for _, w := range f.Writers {
*w.Channel <- item
}
}
}
Когда закончились сообщения — как завершить все и проделать в каждой из них полезную финальную работу?