为了账号安全,请及时绑定邮箱和手机立即绑定

Go Channel 和带有指针变量的 goroutines 所有 goroutines 都睡着

Go Channel 和带有指针变量的 goroutines 所有 goroutines 都睡着

Go
鸿蒙传说 2021-09-10 10:11:14
我花了一晚上的时间研究如何解决这个错误,但我没有成功。当我运行程序时,出现以下错误:“所有 goroutine 都处于睡眠状态 - 死锁!”。我明白这是因为主程序在例程有可能完成其任务之前退出,我认为使用 sync.WaitGroup 会有所帮助,但实际上并非如此:/我想设置一些例程并使用通道发送 url 以检查 http 状态代码。我想限制对网站的并发调用次数。我已经按照示例使用 string 而不是 struct 做同样的事情并且它起作用了。任何帮助将不胜感激:)package mainimport (    "fmt"    "sync"    "time")const (    numPollers = 2                // number of Poller goroutines to launch)var urls = []string{    "http://www.google.com/",    "http://golang.org/",    "http://blog.golang.org/",    "http://golangtutorials.blogspot.fr",    "https://gobyexample.com/",}// Resource represents an HTTP URL to be polled by this program.type Resource struct {    url      string}func Poller(in <-chan *Resource, wg *sync.WaitGroup) {    //defer wg.Done()    for r := range in {        fmt.Printf("Finished: %v - %v\n", r.url, time.Now())    }    wg.Done()}func main() {    var wg sync.WaitGroup    pending := make(chan *Resource)    wg.Add(len(urls))    go Poller(pending, &wg)    go func() {        for _, url := range urls {            wg.Add(1)            fmt.Println("SENT > Pending url " + url)            pending <- &Resource{url: url}        }    }()    wg.Wait()    fmt.Printf("Finished all goroutines: %v\n", time.Now())}https://play.golang.org/p/B-HSiDo2Qg
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信