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

Подскажите мне плиз, кто тут в горутинах шарит 😁 есть такой

код
var (
wg sync.WaitGroup
errorsCh = make(chan error)
)

go func() {
wg.Wait()
close(errorsCh)
}()
for _, url := range urls {
go func() {
defer wg.Done()
wg.Add(1)
...
}()
}
select {
case err := <-errorsCh:
return nil, err
}
...
проблемный ли он?
что будет в случае, если urls пустой

6 ответов

24 просмотра

Привет! Этот код реализует модель конкурентного выполнения задач с использованием горутин и каналов в Go. Проблемы с кодом могут возникнуть в следующих случаях: Если urls пустой (не содержит элементов), то ни одна горутина не будет создана, и wg.Wait() будет вызываться немедленно. В этом случае, канал errorsCh будет закрыт без каких-либо ошибок. Если эта логика соответствует вашим требованиям, то это не проблема. Если urls содержит элементы, то для каждого элемента будет создана отдельная горутина с помощью анонимной функции go func() {...}. Каждая горутина вызывает wg.Add(1) для инкремента счетчика ожидания wg, а затем defer wg.Done() для уведомления о завершении работы. select используется для ожидания ошибок из канала errorsCh. В случае получения ошибки из канала, код возвращает nil и ошибку. Если никаких ошибок не возникает в горутинах и errorsCh не получает никаких значений, то select будет блокироваться и код продолжит свое выполнение. Таким образом, основные проблемы с кодом связаны с обработкой ошибок и с тем, что он может быть заблокирован в случае, если никаких ошибок не возникает и errorsCh не закрывается. В зависимости от требований вашего кода, вам может потребоваться добавить дополнительную логику обработки ошибок или завершения работы горутин.

Данил
Привет! Этот код реализует модель конкурентного вы...

По моему он самую очевидную проблему не сказал

https://pkg.go.dev/golang.org/x/sync/errgroup Возьми это и меньше граблей соберёшь

Alex- Автор вопроса
Maxim Biryukov
https://pkg.go.dev/golang.org/x/sync/errgroup Возь...

да не, err тут для примера, логика там похитрее в общем случае

Alex- Автор вопроса

Если urls пустой (не содержит элементов), то ни одна горутина не будет создана, и wg.Wait() будет вызываться немедленно. В этом случае, канал errorsCh будет закрыт без каких-либо ошибок. Если эта логика соответствует вашим требованиям, то это не проблема. правильно ли я понимаю, что наши опасения опровергнуты чатомГПТ? :)

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта