限制goroutine的数量

关键,使用带缓冲的channel,当channel数量达到限制的最大数量时,会阻塞。

所有的goroutine必须都要运行,每次运行指定的数量(不可一次性运行,会导致带宽占满),这就要使用到waitgroup。

以下是没有使用waitgroup的情况,最后结果是并不是所有的url都打印了,这当然不是想要的结果。

package main

import (
	"fmt"
	"sync"
	"time"
)
var maxRoutineNum = 2
// routine限制最大数量
func main(){
	ch := make(chan int, maxRoutineNum)
	var urls = []string{
		"http://www.golang.org/",
		"http://www.google.com/",
		"http://www.somestupidname.com/",
		"http://www.golang.org/11",
		"http://www.google.com/11",
		"http://www.somestupidname.com/11",
		"http://www.golang.org/22",
		"http://www.google.com/22",
		"http://www.somestupidname.com/22",
		"http://www.golang.org/33",
		"http://www.google.com/33",
		"http://www.somestupidname.com/33",
	}

	for _, u := range urls {
	
		ch <- 1
	
		go download1(u, ch)
	}
}
// 模拟下载方法
func download1(url string, ch chan int) {
	fmt.Println( url)
	// 休眠2秒模拟下载
	time.Sleep(time.Second * 2)
	// 下载完成从ch取出数据
	x:= <- ch
	fmt.Println("x:",x)
}

下图为运行结果(每次运行的可能不一样,goroutine,你懂的),显然没有打印出所有的结果:

 

再看使用了waitgroup的效果:

package main

import (
	"fmt"
	"sync"
	"time"
)
var maxRoutineNum = 2
// routine限制最大数量
func main(){
	ch := make(chan int, maxRoutineNum)
	var urls = []string{
		"http://www.golang.org/",
		"http://www.google.com/",
		"http://www.somestupidname.com/",
		"http://www.golang.org/11",
		"http://www.google.com/11",
		"http://www.somestupidname.com/11",
		"http://www.golang.org/22",
		"http://www.google.com/22",
		"http://www.somestupidname.com/22",
		"http://www.golang.org/33",
		"http://www.google.com/33",
		"http://www.somestupidname.com/33",
	}
	wg := sync.WaitGroup{}
	for _, u := range urls {
		wg.Add(1)
		ch <- 1
		go download(u, ch, &wg)
	}
	wg.Wait()
}
// 模拟下载方法
func download(url string, ch chan int , wg *sync.WaitGroup) {
	fmt.Println( url)
	// 休眠2秒模拟下载
	time.Sleep(time.Second * 2)
	// 下载完成从ch取出数据
	x:= <- ch
	wg.Done()

	fmt.Println("x:",x)
}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值