Go多线程并发避免堵塞

原创
2018/11/22 11:50
阅读数 3.1K

最近在做一个小项目,涉及到多线程并发,由于并发数量大,所以需要对并发数量进行限制。第一次使用Go,开发过程中经常掉坑里,阅读了一堆文档,最后终于拼凑出了下面这段代码,试运行感觉效果不错,发上来备忘!

package main

import (
	"fmt"
	"math/rand"
	"runtime"
	"strconv"
	"sync"
	"time"
)

func main() {
	//并发数
	runtime.GOMAXPROCS(0)
	sw := sync.WaitGroup{}
	ch := make(chan int, 6)
	//提前推入缓存,避免被消费完
	ch <- 1

	for i := 0; i < 10; i++ {
		//避免出现堵塞
		ch <- 1
		go func(i int) {
			sw.Add(1)
			//随机生成休眠时间
			rand.Seed(time.Now().Unix())
			s := rand.Intn(10-3) + 3
			time.Sleep(time.Duration(s) * time.Second * 1)
			fmt.Println(strconv.Itoa(i) + " 休眠时间:" + strconv.Itoa(s) + " 秒")
			defer func() { <-ch }()
			defer sw.Done()
		}(i)
		time.Sleep(time.Second)
	}

	sw.Wait()
}

 

展开阅读全文
Go
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部