猿问

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

我花了一晚上的时间研究如何解决这个错误,但我没有成功。当我运行程序时,出现以下错误:“所有 goroutine 都处于睡眠状态 - 死锁!”。我明白这是因为主程序在例程有可能完成其任务之前退出,我认为使用 sync.WaitGroup 会有所帮助,但实际上并非如此:/


我想设置一些例程并使用通道发送 url 以检查 http 状态代码。我想限制对网站的并发调用次数。我已经按照示例使用 string 而不是 struct 做同样的事情并且它起作用了。


任何帮助将不胜感激:)


package main


import (

    "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


鸿蒙传说
浏览 185回答 2
2回答
随时随地看视频慕课网APP

相关分类

Go
我要回答