1. 我是皮皮虾首页
  2. 编程开发
  3. 后端
  4. Goland

golang sync.waitgroup的一个错误用法

close位置问题

错误用法

	cancel := make(chan bool)
	// 控制并发数为10
	limit := make(chan bool, 10)
	var wg sync.WaitGroup

	for i := 0; i < 100; i++ {
		wg.Add(1)
		limit <- true
		fmt.Println("limit len",len(limit))
		go Worker2(i, cancel, &wg, limit)
		fmt.Println("===========" + strconv.Itoa(i) + "=============")
	}
	//我们通过close来关闭cancel管道向多个Goroutine广播退出的指令
	
	fmt.Println("done:",Counter)

	wg.Wait()
        close(cancel)

正确用法

  • close()得在wait前面
close(cancel)
wg.Wait()

控制每秒并发多个

  • 添加 time.Sleep(time.Second)
        cancel := make(chan bool)
	// 控制并发数为10
	limit := make(chan bool, 10)
	var wg sync.WaitGroup
    

	for i := 0; i < 100; i++ {
		wg.Add(1)
		limit <- true
		fmt.Println("limit len",len(limit))
		go func(i int) {
			defer wg.Done()
			log.Println(i)
                        // 控制每秒并发10个
			time.Sleep(time.Second) 
                       // 注意limit的位置,放在最后
			<-limit
		}(i)
		
	}
	
	
	fmt.Println("done:",Counter)

	wg.Wait()
        close(cancel)

原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/2061/%e7%bd%91%e7%bb%9c%e5%bc%80%e5%8f%91/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注