首页 > 解决方案 > Golang 频道不关闭

问题描述

我不明白,为什么频道没有关闭。我Waitgroup过去常常在它之后显式等待并关闭频道……但是程序没有退出。谢谢您的帮助

https://play.golang.org/p/lto2DytWH13

package main

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

var wg sync.WaitGroup

func main() {
    links := []string{
        "http://google.com",
        "http://facebook.com",
        "http://stackoverflow.com",
        "http://golang.org",
        "http://amazon.com",
    }
    wg.Add(len(links))
    c := make(chan string)

    for _, link := range links {
        go checkLink(link, c, &wg)
    }
    wg.Wait()
    close(c)
    for u := range c {
        fmt.Println(u)
    }
}

func checkLink(link string, c chan string, wg *sync.WaitGroup) {
    _, err := http.Get(link)
    if err != nil {
        fmt.Println(link, "might be down!")
        c <- link
        return
    }

    fmt.Println(link, "is up!")
    c <- link
    wg.Done()
}

标签: gochannelgoroutine

解决方案


以下是您的程序存在的问题:

  • 当 goroutine 成功读取链接时,它会打印is up!消息,并开始等待写入通道。主 goroutine 等待所有 goroutine 退出,然后关闭通道并从中读取。此时,所有的 goroutine 都处于休眠状态。
  • 您正在关闭频道并从中读取。这将立即返回零值,即“”
  • wg.Done()如果从链接读取失败,您的 goroutine 将返回而不调用。

要修复,请使用:

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

推荐阅读