Size: a a a

2020 July 29

IK

Ilya Kaznacheev in Go-go!
Георгий Папаскири
имею функцию:
func snmpNew(hosts []string) {
 var hl []string
 var wg sync.WaitGroup
 wg.Add(len(hosts))
 for _, host := range hosts {
   go func(host string, hl *[]string, wg *sync.WaitGroup) {
     defer wg.Done()
     *hl = append(*hl, host)
   }(host, &hl, &wg)
 }
 wg.Wait()
 fmt.Println(hl)
 for _, i := range hl {
   classes.FileWriteString("temp_new", i)
 }
}
в функцию передаю массив из 254 элементов, дальше с помощью гоурутины создаю новый массив, и результат записываю в файл, в новый массив попадает только часть из них, а не все 254 элемента
Зачем вообще это в горутине делать?
источник

VS

Vladimir Smirnov in Go-go!
условно сделать что-то в духе:
func snmpNew(hosts []string) {
 hl := make([]string, len(hosts))
 var wg sync.WaitGroup
 wg.Add(len(hosts))
 for i, host := range hosts {
   go func(i int, host string, hl []string, wg *sync.WaitGroup) {
     defer wg.Done()
     hl[i] = host
   }(i, host, hl, &wg)
 }
 wg.Wait()
 fmt.Println(hl)
 for _, i := range hl {
   classes.FileWriteString("temp_new", i)
 }
}
источник

IK

Ilya Kaznacheev in Go-go!
Разделили работу, которая не может быть асинхронной, и потом руками иделали ее обратно синхронной
источник

IK

Ilya Kaznacheev in Go-go!
Или это такой прикол?
источник

ГП

Георгий Папаскири... in Go-go!
Ilya Kaznacheev
Зачем вообще это в горутине делать?
Это я просто проверял из-за чего могут теряться данные. Гоурутина мне для другой цели, snmp (для начала)
источник

ЛА

Локоть Анатолий... in Go-go!
Георгий Папаскири
если вы про mutex.lock, то потому что иначе часть данных теряется
Да,а вашем кейсе надо делать
hl[i] = host, без мьютекса. Он будет не нужен тогда.

Без мьютекса нельзя обойтись, если размер слайса заранее неизвестен. У вас известен.
источник

IK

Ilya Kaznacheev in Go-go!
Георгий Папаскири
Это я просто проверял из-за чего могут теряться данные. Гоурутина мне для другой цели, snmp (для начала)
Я вам советую (если хотите в горутине делать работу и потом писать в слайс) писать в горутине в канал, а из канала в своей основной рутине аппендить в слайс
источник

ГП

Георгий Папаскири... in Go-go!
Локоть Анатолий
Кстати, норм.
Если заранее создать слайс правильной длины и писать элементы по индексам, то не будет race
Длина заранее не известна.
источник

IK

Ilya Kaznacheev in Go-go!
Георгий Папаскири
Длина заранее не известна.
Длина у вас известна в начале функции - len(hosts)
источник

VS

Vladimir Smirnov in Go-go!
Георгий Папаскири
Длина заранее не известна.
на этапе создания горутин неизвестна?
источник

VS

Vladimir Smirnov in Go-go!
тогда пример слишком синтетический выходит
источник

ЛА

Локоть Анатолий... in Go-go!
Георгий Папаскири
Длина заранее не известна.
У вас длина hl равна длине hosts
источник

p

pragus in Go-go!
Георгий Папаскири
Длина заранее не известна.
wg.Add(len(hosts))
источник

ГП

Георгий Папаскири... in Go-go!
Это длина массива, по которому я прохожусь, но возвращаемый массив у меня будет меньше
источник

AS

Andrey S in Go-go!
Георгий Папаскири
имею функцию:
func snmpNew(hosts []string) {
 var hl []string
 var wg sync.WaitGroup
 wg.Add(len(hosts))
 for _, host := range hosts {
   go func(host string, hl *[]string, wg *sync.WaitGroup) {
     defer wg.Done()
     *hl = append(*hl, host)
   }(host, &hl, &wg)
 }
 wg.Wait()
 fmt.Println(hl)
 for _, i := range hl {
   classes.FileWriteString("temp_new", i)
 }
}
в функцию передаю массив из 254 элементов, дальше с помощью гоурутины создаю новый массив, и результат записываю в файл, в новый массив попадает только часть из них, а не все 254 элемента
О! И ты чтоли здесь? :) Вы там всей конторой на Go подсели чтоли? :)
источник

ГК

Георгий Когония... in Go-go!
Andrey S
О! И ты чтоли здесь? :) Вы там всей конторой на Go подсели чтоли? :)
Ко мне в монитор подглядывал и заразился, мы теперь рядом сидим
источник

ГП

Георгий Папаскири... in Go-go!
Грубо говоря, есть 200 хостов, надо по всем пройтись снмп, но ответ вернут не все, а запись в массив нужен результат только от тех, что ответили
источник

AS

Andrey S in Go-go!
Ещё братьев "Греби-бля" и "Гребу-бля" подсадите...
источник

ГП

Георгий Папаскири... in Go-go!
Так что длина получаемого массива мне заранее не известна
источник

DM

Dmitry M in Go-go!
Георгий Папаскири
Грубо говоря, есть 200 хостов, надо по всем пройтись снмп, но ответ вернут не все, а запись в массив нужен результат только от тех, что ответили
Пиши результат в канал
источник