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 ответов

31 просмотр

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

Контекст внутри 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 по быстрому нагуглил.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта