我花了一晚上的时间研究如何解决这个错误,但我没有成功。当我运行程序时,出现以下错误:“所有 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
相关分类