当前位置: 首页 > article >正文

Go 设置并发控制数量 【go并发模型】

背景:go的并发控制也是老生常谈,在公司业务中也是经常出现

谈谈我们这次并发模型的适用场景:要处理的任务很多比如有10000个,没开并发的时候我们要一个一个进行执行这个时候其实无论是cpu压力还是数据库和redis压力都比较小也就是说它们现在还很闲,我们可以给它们加并发压榨cpu和数据库的工作效率

限制:理论上讲并发数小于任务数,总不能1000个任务开2000个并发,首先就像1000个馒头让2000个人去吃一样撤,其次是开2000个并发如果任务比较重那数据库也受不了报警

我给出的并发模型的可以通过修改channel的容量来控制并发数

接下来看代码

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	GNUM := 100 //携程并发数
	ch := make(chan struct{}, GNUM)
	wg := sync.WaitGroup{}
	start := time.Now().Second() //记录开始时间
	for i := 1; i <= 1000; i++ {
		ch <- struct{}{}
		wg.Add(1)
		go func(i int) {
			defer func() {
				fmt.Printf("task%d执行完毕\n", i)
				<-ch
				wg.Done()
			}()
			fmt.Printf("执行task%d   \n", i)
			time.Sleep(1 * time.Second)
		}(i)
	}
	wg.Wait()
	close(ch)
	end := time.Now().Second()                       //记录结束时间
	fmt.Printf("并发数:%d 时 花费时间为:%d", GNUM, end-start) //输出处理任务的总时间 单位S

}

这个代码假设是每个任务执行时间是1秒如果我们不开并发执行1000个任务是1000秒但如果我们开100个并发只需要10秒 1000个并发只需要1秒 10个并发小于10秒

 


http://www.kler.cn/news/359493.html

相关文章:

  • nfs 中 lockd 与 statd 的作用
  • 终于找到了!Ubuntu 虚拟机卡死的终极解决方案(如何解决VMware安装Ubuntu24.04桌面进不去、黑屏、虚拟机卡死、显示不全、屏幕闪烁等问题)
  • 10月20日
  • Docker报错-Docker Desktop - Unexpected WSL error
  • [while循环]k的幂
  • 如何利用CMMI帮助组织消除低价值流程
  • 深入理解 Netty 中的 Unpooled 使用方法
  • LeetCode Hot100 | Day4 | 层序遍历有序数组转搜索树验证搜索树搜索树中第K小的元素
  • 如何查看python安装了哪些包
  • 【设计模式】Python 设计模式之建造者模式(Builder Pattern)详解
  • docker网络连接模式详解
  • 基于Android Studio购物商城app+web端,登录实现(前后端分离)二
  • ant design vue TimePicker时间选择器不点击确认也可以设置值
  • 破局汽车基础软件发展丨昂辉科技亮相2024芜湖新能源汽车零部件和后市场生态博览会
  • 【C++STL】list的基本介绍与使用方式
  • Django学习-静态文件
  • 【机器学习】简单易懂的聚类算法K-Means
  • 每日回顾:简单用C写 选择排序、堆排序
  • 基于Android Studio购物商城app+web端实现(前后端分离)一
  • Thread类的基本用用法