业务场景如下:
我这里有很多的资源url, 要将他们都下载下来并处理,我将每个获取url资源的方法处理成异步go func(){}(), 它们每个处理完成了要把相应的数据返回给主goroutine, 开始时我用waitgroup能达到效果,但感觉有问题,如果url特别多时创建的goroutine特别多,因此我加一个chan去控制每次只能10条同时处理, 但一直报deadline, 这方面的高手帮忙指点下,怎么处理比较好,我的测试代码大概如下:
```golang
package main
import "fmt"
func main() {
msg := make(chan int)
poolSize := make(chan bool, 10)
for i := 1; i <= 100; i++ {
doSomeThing(msg, poolSize, i)
}
for m := range msg {
fmt.Println(m)
}
fmt.Println("end")
}
func doSomeThing(message chan<- int, poolSize chan bool, value int) {
poolSize <- true
defer func() {
<-poolSize
}()
go func(message chan<- int, value int) {
message <- value
}(message, value)
}
```
这是其中的一种控制模型
```golang
package main
import "fmt"
func main() {
msg := make(chan int)
// poolSize := make(chan bool, 10)
poolSize:=10
for i := 1; i <= poolSize; i++ {
go doSomeThing(msg, i)
}
for m := range msg {
fmt.Println(m)
}
fmt.Println("end")
}
func doSomeThing(message chan<- int, value int) {
for {
func(message chan<- int, value int) {
message <- value
}(message, value)
}
}
```
另一种控制模型
```golang
import "fmt"
func main() {
msg := make(chan int)
poolSize := make(chan bool, 10)
for i := 1; i <= 100; i++ {
go doSomeThing(msg, poolSize, i)
}
for m := range msg {
fmt.Println(m)
}
fmt.Println("end")
}
func doSomeThing(message chan<- int, poolSize chan bool, value int) {
poolSize <- true
defer func() {
<-poolSize
}()
func(message chan<- int, value int) {
message <- value
}(message, value)
}
```
这种模型同样会创建100个goroutine,只不过这些routine都在等待,同时活动的数量是poolsize
#1