Я довольно новичок в параллелизме, и я решил запустить несколько частей моего обработчика http в goroutines, и он начал поглощать мою оперативную память и зависал мой компьютер.
Вот что я пытаюсь сделать:
Мой обработчик имеет эти два вызова функций
qChan := cloneQuestions(currentFormView.QuestionObjects, currentForm.Id, currentForm.VersionNumber, now)
rChan := cloneRules(currentFormView.RuleObjects, currentForm.Id, currentForm.VersionNumber, now)
Оба этих вызова функций определены в файле helpers.go, и они возвращают каналы структур своим вызывающим.
Это определение функции cloneQuestions, и clonedRules следует той же схеме, что и эта
func cloneQuestions(questions []question.Model, formID string, versionNumber int, now time.Time) <-chan question.Model {
out := make(chan question.Model)
go func() {
for _, currentQuestion := range questions {
out <- getClonedQuestion(currentQuestion, formID, versionNumber, now)
}
close(out)
}()
return out
}
func getClonedQuestion(currentQuestion question.Model, formID string, versionNumber int, now time.Time) question.Model {
newOptionsArray := cloneQuestionOptions(currentQuestion, formID, now)
return currentQuestion
}
cloneRules
очень похож на этот
После вызова этих двух функций в моем обработчике и сохранения их возвращенных каналов в переменных qChan и rChan, как описано выше, я запускаю бесконечный цикл для одновременного потребления значений из обоих каналов и прекращаю работу цикла, как только прекращаю получать значения из обоих каналы, вот код
for {
select {
case clonedQuestion := <-qChan:
insertQuestionToFormTxn := h.service.Mongo.GetAppendTxn(ctx, form.COLLECTION, currentForm.FormID, "questions", clonedQuestion.Id, clonedQuestion.Order)
newQuestionTxn := h.service.Mongo.GetNewTxn(ctx, question.COLLECTION, clonedQuestion, clonedQuestion.Id)
// collect all the txns in the arrray
array = append(array, insertQuestionToFormTxn, newQuestionTxn)
case clonedRule := <-rChan:
newRuleTxn := h.service.Mongo.GetNewTxn(ctx, rule.COLLECTION, clonedRule, clonedRule.Id)
// collect all the txns in the arrray
array = append(array, insertRuleToFormTxn, newRuleTxn)
default:
break
}
}
Когда я делаю запрос к этому обработчику и запускаю htop рядом, я увидел, что он начал заполнять мою оперативную память и заморозил мою машину, почему это происходит?