golang 协程接收数据,限制线程数量

需求

使用golang协程,并限制协程数量。

package main

import (
	"fmt"
	"math/rand"
	"sync"
)

type Report struct {
	Name string `json:"name"`
}

func main() {

	c := make(chan struct{}, 2)
	cReports := make(chan []Report, 1)
	wg := sync.WaitGroup{}

	defer close(c)
	defer close(cReports)

	for i := 0; i < 80; i++ {
		c <- struct{}{}
		wg.Add(1)
		go func(i int) {
			wg.Done()
			reports := make([]Report, 0)
			for j := 0; j < rand.Intn(500); j++ {
				for k := 0; k < rand.Intn(500); k++ {
					reports = append(reports, Report{Name: fmt.Sprintf("i-%d-j-%d-k-%d", i, j, k)})
				}
				fmt.Println("send reports ", reports)
			}

			//time.Sleep(time.Second)
			<-c
			cReports <- reports
		}(i)
	}

	wg.Wait()

Recv:
	for {
		select {
		case r, ok := <-cReports:
			fmt.Println("r,ok", r, ok)
		default:
			fmt.Println("recv finish")
			break Recv
		}
	}

	fmt.Println("finish")
}

问题注意

<-ccReports <- reports 需要在同一层,如果cReports <- reports写在 for j := 0; j < rand.Intn(500); j++ { 里面,将无法成功,会报错 fatal error: all goroutines are asleep - deadlock!

报错内容

fatal error: all goroutines are asleep - deadlock!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值