Как вернуть результат успеха или неудачи в goroutine основной функции и fmt.Println количество успехов - PullRequest
0 голосов
/ 20 января 2020

Я хочу записать содержимое функции процесса с функцией, отличной от основной функции.

Я хочу посчитать количество URL, которые не привели к ошибке, с помощью "resp, err: = client.Do (req) ".

Я хочу записать количество успехов до fmt.Println (" Fini sh! ") в основной функции.

Что мне делать ?

func main() {
    site_list := [][]string{
        {"site1","https://www.aaaa"},
        {"site2","https://www.bbbb"},
        {"site3","https://www.cccc"},
        {"site4","https://www.dddd"},
    }

    var wg sync.WaitGroup
    maxChan := make(chan bool, 2)

    for _, v := range site_list {
        maxChan <- true
        wg.Add(1)
        go process(v[1], maxChan, &wg)
    }
    wg.Wait()
    fmt.Println("Finish!")
}

func process(site_url string, maxChan chan bool, wg *sync.WaitGroup) {
    defer wg.Done()
    defer func(maxChan chan bool) {
        <-maxChan
    }(maxChan)
    req, err := http.NewRequest("GET", site_url, nil)
    client := new(http.Client)
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("client.Doエラー" + site_url)
        return
    }
    defer resp.Body.Close()
}

1 Ответ

0 голосов
/ 20 января 2020

Согласно моему комментарию выше, создайте собственную структуру рабочего элемента:

type urlItem struct {
    Name string
    Url  string
    Err  error
}

Используйте указатели, чтобы функция process() могла обновить базовую структуру:

site_list := []*urlItem{
    &urlItem{"site1", "https://www.aaaa", nil},
    &urlItem{"site2", "https://www.bbbb", nil},
    &urlItem{"site3", "https://www.cccc", nil},
    &urlItem{"site4", "https://www.dddd", nil},
}

process() может затем безопасно обновить свой конкретный рабочий элемент (без необходимости каких-либо мьютексов или синхронизации), поскольку каждая go -программа получает уникальный рабочий элемент.

func process(site *urlItem, maxChan chan bool, wg *sync.WaitGroup) { /* ... */ }

Затем подсчитайте go - процедура errors в конце:

var failCount int

for _, v := range site_list {
    if v.Err != nil {
        failCount++
    }
}

Пример игровой площадки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...