Можем ли мы реализовать goroutine в goroutine? - PullRequest
0 голосов
/ 01 февраля 2019

Я использую функции в функции, потому что я хочу, чтобы, когда функция запустилась, в это время также выполнялись запросы базы данных.Но есть вопрос, который я спрашиваю, можем ли мы реализовать goroutine в другой goroutine, потому что в функции я уже установил подпрограмму go, но в этой подпрограмме go есть запросы больше, и я хочу, чтобы они также выполнялись, когда родительская подпрограмманачинается.Пример

func main(){
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go func(){
       defer wg.Done()
       Id,err := QueryWhichWillReturnId()
       if err == nil{
           wg.Add(1)
           go func(){
               defer wg.Done()
               data:= GetAnyDataById(Id)
               fmt.Println(data)
           }()
       }
    }()
  wg.Wait()
}

Возможен ли приведенный выше пример при реализации процедур?

любые предложения будут оценены.

1 Ответ

0 голосов
/ 01 февраля 2019

Горутин может начинаться с паранормального режима. Как только горутин B начинается с goroutineA, они имеют одинаковый вес.

Есть кое-что, что вы должны учитывать, если вы хотите сделать это следующим образом.

Нужно ли запускать мою новую программу?

Я приведу пример того, что запрос должен быть сохранен как в базе данных, так и на удаленном сервере журналов.Два шага сохранения параллельны и без помех.Тогда это хорошо, чтобы начать 2 Goroutine.Один для сохранения в базе данных, другой для сохранения на сервере регистрации. Теперь вы посмотрите на свой запрос.GetAnyDataById(Id), очевидно, ваш новый стандартный запрос зависит от вашей прежней формы результата запроса QueryWhichWillReturnId(), они не мешают?они логическая параллель?Ни один, так что это плохое место для использования goroutine.

Наконец, вы wg.Add(1), но вы дважды wg.Done(), это будет паниковать.

Можем ли мы реализовать goroutine внутри goroutine?да.вы можете использовать go func(){}() везде, где вы хотите начать новую программу.

func main(){
    wg := &sync.WaitGroup{}
    wg.Add(1)
    go func(){
       defer wg.Done()
       Id,err := QueryWhichWillReturnId()
       if err != nil{
           fmt.Println(err.Error())
           return
       }
       data:= GetAnyDataById(Id)
       fmt.Println(data)
    }()
  wg.Wait()
}
...