У моей программы многолетняя задача. У меня есть список jdIdList
, который слишком большой - до 1000000
элементов, поэтому код ниже не работает. Есть ли способ улучшить код с лучшим использованием goroutines?Разумное использование goroutines в программах Go
Кажется, у меня слишком много запущенных goroutines, из-за чего мой код не запускается.
Что такое разумное количество горутинцев для бега?
var wg sync.WaitGroup
wg.Add(len(jdIdList))
c := make(chan string)
// just think jdIdList as [0...1000000]
for _, jdId := range jdIdList {
go func(jdId string) {
defer wg.Done()
for _, itemId := range itemIdList {
// following code is doing some computation which consumes much time(you can just replace them with time.Sleep(time.Second * 1)
cvVec, ok := cvVecMap[itemId]
if !ok {
continue
}
jdVec, ok := jdVecMap[jdId]
if !ok {
continue
}
// long time compute
_ = 0.3*computeDist(jdVec.JdPosVec, cvVec.CvPosVec) + 0.7*computeDist(jdVec.JdDescVec, cvVec.CvDescVec)
}
c <- fmt.Sprintf("done %s", jdId)
}(jdId)
}
go func() {
for resp := range c {
fmt.Println(resp)
}
}()
В чем вопрос? –
@FilipHaglund Я меняю вопрос – roger
Мне все еще трудно понять, что вы на самом деле пытаетесь спросить. Вы говорите, что ваша проблема в том, что 'jdIdList' слишком большой, но это не ваша фактическая проблема, не так ли? Что происходит, и что вы хотите? –