Параллелизм в Go - PullRequest
       1

Параллелизм в Go

0 голосов
/ 07 декабря 2018

Как мне перейти к реализации шаблона агрегации в Go, я должен одновременно отправить группу http-запросов, где каждая подпрограмма go будет вызывать конечную точку и отправлять статус ответа по каналу.Теперь по основной вызывающей функции я буду проходить через канал и отображать все ответы.

Проблема в том, как разблокировать канал ??- Я не могу закрыть канал из подпрограмм go, поскольку он будет закрыт до завершения всей работы

основной пакет

import (
    "fmt"
    "net/http"
    "sync"
    "time"

    "golang.org/x/net/context"
)

func main() {

    var wg sync.WaitGroup
    wg.Add(10)
    c := make(chan string, 100)
    ctx := context.Background()

    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)

    defer cancel()
    for i := 1; i <= 10; i++ {
        go SendHttpRequest(ctx, c, &wg)
    }

    for v := range c {
        fmt.Println(v)
    }

    wg.Wait()

}

func SendHttpRequest(ctx context.Context, c chan string, wg *sync.WaitGroup) {

    //defer wg.Done()
    client := http.Client{}
    req, err := http.NewRequest("POST", "https://jsonplaceholder.typicode.com/posts/1", nil)
    if err != nil {
        panic(err)
    }
    req.WithContext(ctx)

    res, _ := client.Do(req)

    select {
    case <-time.After(1 * time.Microsecond):
        c <- res.Status
    case <-ctx.Done():
        c <- "599 ToLong"
    }
    if res != nil {
        defer res.Body.Close()
    }
    //close(c)
    defer wg.Done()
}

1 Ответ

0 голосов
/ 07 декабря 2018

Используйте WaitGroup

go func(){
  wg.Wait()
  close(c)
}()

for v := range c {
  fmt.Println(v)
}

// Don't bother with wg.Wait() here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...