170 похожих чатов

Никто тут случайно не использует errgroup.WithContext(context.Background()) ? и семафоры? вопрос можно ли

делать вложенные семафоры?

по какой причине
у меня в этом коде может вылететь c
ошибка

error can't acquire semaphore during Upload: context canceled ??

как может context.Background() быть отменен?
s := semaphore.NewWeighted(int64(b.cfg.General.UploadConcurrency))
g, ctx := errgroup.WithContext(context.Background())

for i, table := range tablesForUpload {
if err := s.Acquire(ctx, 1); err != nil {
return fmt.Errorf("can't acquire semaphore during Upload: %v", err)
}

30 ответов

11 просмотров

попробуйте переписать код на использование канала, думаю сразу найдете в чем проблема

Контекст внутри errgroup может быть отменён из того что одна из тасок, запущенных в errgroup, вернула ошибку

Зачем отдельная либа для семафора вообще? Семафор же на буферизированном канале легко пишется

Slach-[altinity] Автор вопроса
c
Контекст внутри errgroup может быть отменён из тог...

а кем он может быть отменен? как бы это узнать?

Михаил Макарычев
Зачем отдельная либа для семафора вообще? Семафор ...

если надо уметь отменять ожидание - это уже не так легко

Михаил Макарычев
Зачем отдельная либа для семафора вообще? Семафор ...

ну так это и есть обёртка но можно по идее и на sync.Cond сделать

Slach [altinity]
а кем он может быть отменен? как бы это узнать?

Опять же переписать с errgroup на waitgroup :) Вообще главное правило при встрече с непонятным багом - выкидывать нафиг не нужные абстракции типа семаформа и errgroup и максимально все упрощать и в какой то момент станет понятно что происходит

Slach-[altinity] Автор вопроса
Andrei 🦉 Sergeev
Опять же переписать с errgroup на waitgroup :) Воо...

спасибо за совет все переписать... но как бы errorgroup мне как раз тут в канале и посоветовали =) задача у меня достаточно простая была, мне нужен пулл горутин с контроллируемым кол-вом одновременно запущеных... и возможностью узнать что одна из go routine вернула ошибку...

Slach-[altinity] Автор вопроса
c
Контекст внутри errgroup может быть отменён из тог...

так, стоп, а разве это не будет отображаться вот в таком коде if err := g.Wait(); err != nil { return fmt.Errorf("one of upload go-routine return error: %v", err) } ?

Slach [altinity]
спасибо за совет все переписать... но как бы error...

ну если вы не справились с инструментом, то наверное все таки сначала стоит попробовать решить задачу без этого инструмента, посмотреть в чем проблема и уже потом наворачивать сверху errgroup и семафор

использую и еще надо gctx.Done() читать, иначе нет смысла юзать WithContext.

Slach-[altinity] Автор вопроса
c
зачем?

если горутина из errorgroup читает из другого канала и какая-то одна из горутин завершилась ошибкой, то остальные горутины могут утечь.

Slach [altinity]
а как у вас это в коде выглядит?

Вот прямо как в этом примере - https://pkg.go.dev/golang.org/x/sync/errgroup#example-Group-Pipeline for i := 0; i < numDigesters; i++ { g.Go(func() error { for path := range paths { data, err := ioutil.ReadFile(path) if err != nil { return err } select { case c <- result{path, md5.Sum(data)}: case <-ctx.Done(): return ctx.Err() } } return nil }) }

Elmanov Anton
Вот прямо как в этом примере - https://pkg.go.dev/...

Ну так Acquire внутри это и делает в коде выше

Slach-[altinity] Автор вопроса
c
будет

то есть я правильно понимаю, что если возникла ошибка в какой то go routine но при этом g.Wait еще не стартанул, то context canceled поймается на s.Acquire ?

Slach [altinity]
то есть я правильно понимаю, что если возникла оши...

при возврате ошибки из коллбэка в Go, контекст, который возвращает WithContext,будет отменён

Slach-[altinity] Автор вопроса
c
при возврате ошибки из коллбэка в Go, контекст, ко...

это я понял но почему это отлавливается в semaphore.Acquire а не в errorgroup.Wait ?

Slach-[altinity] Автор вопроса
c
а вы ошибку не возвращаете?

еще как возвращаю но может быть проблема в том что я делаю g.Go(func() error { defer s.Release(1) ?

Slach-[altinity] Автор вопроса
c
а вы ошибку не возвращаете?

и все таки, правильно ли делать defer s.Release(1) ? или все таки нужно аккуратно перед return err и return nil релизить семафор?

Slach-[altinity] Автор вопроса
Daniel Podolsky
defer ok

Даниил, а вы случайно не подскажете как правильно все таки семафор с ограниченной пропускной способностью + errorgroup использовать? сейчас навтыкал себе везде дебаг логов действительно горутина возвращает ошибку но я почему то думал наивно что ошибка прилетит в g.Wait() (errorgroup) который после цикла в котором g.Go() порождает горутины вызывается а прилетает сразу в семафор =)

Slach [altinity]
Даниил, а вы случайно не подскажете как правильно ...

не, я ничего про них не знаю а оно точно нужно?

Slach [altinity]
спасибо за совет все переписать... но как бы error...

Вернуть можно и через канал что-то... Не уверен что это правильная ссылка https://play.golang.org/p/hNaeTjLwdv по быстрому нагуглил.

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта