首页 > 其他分享 >Go协程常规参考

Go协程常规参考

时间:2023-06-01 15:23:17浏览次数:33  
标签:协程 Group Update 常规 耗时 IO Go 限制器

Go协程

协程对性能的提升:
程序性能由三者决定: 计算时长, 磁盘IO, 网络IO
协程能有效解决IO问题.
对于计算密集型程序则用处较小.

1. 最佳协程使用实践

// 子协程
func CoroutineSubFunc(wg *sync.WaitGroup, resultChannel chan int, limiter chan bool) {
	defer wg.Done()
	result := time.Now().Minute()
	result += 10000
	resultChannel <- result // 单个结果
	<-limiter
}
// 主协程
func CoroutineMainFunc() {
	var wg = &sync.WaitGroup{}  
	var limiter = make(chan bool, 10) // 限制器,10个协程  
	var resultSlice []int // 结果列表  
	var resultChannel = make(chan int, 100)  
	defer close(limiter)
	go func() {
		for response := range resultChannel {
			resultSlice = append(resultSlice, response)
		}
	}()
	for i := 0; i < 10000000; i++ {
		wg.Add(1)
		limiter <- true
		go CoroutineSubFunc(wg, resultChannel, limiter)
	}
	wg.Wait()
	close(resultChannel)
}

2. 协程限制器的必要性(双channel)

网络IO
//limiter <- true  
// 是否单独添加限制器的影响  
//before:  
//Update耗时-Git仓库信息-获取项目人员:1.8998607s  
//Update耗时-Git仓库信息-获取项目人员:1.7111329s  
//Update耗时-Git仓库信息-获取项目人员:1.7577459s  
//Update耗时-Git仓库信息-获取项目人员:1.7185806s  
//Update耗时-Git仓库信息-获取项目人员:1.796424s  
// after:  
//Update耗时-Git仓库信息-获取项目人员:1.9105957s  
//Update耗时-Git仓库信息-获取项目人员:2.0276002s  
//Update耗时-Git仓库信息-获取项目人员:1.8378465s  
//Update耗时-Git仓库信息-获取项目人员:1.9639478s  
//Update耗时-Git仓库信息-获取项目人员:1.9181765s  
计算密集型
// 10mlion, 是否单独添加限制器的影响  
//before:  

//耗时:17.7392589s
耗时:10.6744323s
耗时:12.0589872s
耗时:10.6573216s
耗时:13.3833896s
耗时:10.2832911s
// after:  
//耗时:4.862482s
耗时:4.8140741s
耗时:4.9224885s
耗时:4.8152887s
耗时:4.8263113s
耗时:4.8267736s

高并发场景为什么需要限制器?

协程本身切换是需要保存上下文的, 尽管保存每个协程的开销并不大. 但如果有极高并发的情况下, 没有对应的协程限制器, 从而无限制的制造新的协程, 反而会因为内存占用过多, 导致程序运行缓慢. 严重时会导致程序卡死.
增加协程限制器, 能避免RAM无限制增涨, 以提升效率.

3. 双等待池的处理方式(双WaitGroup)

双等待池的处理方式, 一般是在处理针对协程函数有返回数据的时候.
使用第二的等待池来对chan进行读取.

计算密集: 10milion数据

// 单Group
耗时:4.8263338s
耗时:4.8079532s
耗时:4.8333302s
耗时:4.8605043s
耗时:4.8274169s

// 双Group
耗时:4.8698299s
耗时:4.9381441s
耗时:4.8381543s
耗时:4.9011613s
耗时:4.9681705s

网络IO密集: 1000数据
// 单Group
Update耗时: 2.7795841s
Update耗时: 2.7134584s
Update耗时: 2.9046917s
Update耗时: 2.8001659s
Update耗时: 2.7793065s
// 双Group
Update耗时 :2.9160356s
Update耗时 :2.808227s
Update耗时 :2.7915349s
Update耗时 :2.8187473s
Update耗时 :2.7912972s

综上所述:
因为已经有同一个channel, 对其进行限制.
所以双WaitGroup对于协程取值来讲, 并无必要性.
反而会因为对应的开销, 导致性能相对较慢.

必要性: 保证数据完整性.
性能影响: 增加开销, 性能略微下降

标签:协程,Group,Update,常规,耗时,IO,Go,限制器
From: https://www.cnblogs.com/jrri/p/17449090.html

相关文章

  • GoWeb项目目录结构参考
    GoWeb项目目录结构目录结构main.gogo.modgo.summodel 数据库操作,增删改查,固化的通用接口view 视图文件controller 通讯请求,API操作等内容等业务逻辑router middleware 中间件部分可以放置在根目录,也可以放置在router内.gin项目一般放置在router目录内confi......
  • 从Google、创业再到字节跳动,我在开源领域的实践与思考
    点击以下链接收听本期“大咖访谈”播客,与大咖面对面:https://www.xiaoyuzhoufm.com/episodes/64780ea016726282409baf70开源雨林:请您先向观众介绍自己大家好,我是张鑫。以往在不同场合我会有很多不同的介绍方式,今天我想多聊聊与开源的缘分。我从事过科研、尝试过创业、在互联网......
  • 「解题报告」CF739E Gosha is hunting
    来南京第二天就感冒了,然后嗓子疼,头疼炸了。哈哈。等等是不是春季赛前我也这个状态来着。呃呃。好像确实一模一样。这玩意跟DP有个鬼关系。下面两个概率用\(u_i,v_i\)表示。首先如果只选两者之一,贡献为\(u_i/v_i\),如果两者都选那么贡献为\(u_i+v_i-u_iv_i\)。我......
  • 进程,线程,协程
    注:本文章转载自:http://chuquan.me/2021/05/05/getting-to-know-coroutine/个人有部分改动进程&线程进程的本质就是 一个程序的执行实例。在进程模型中,进程拥有对内存、I/O通道、I/O设备和文件等资源的控制权。补充:进程和程序的关系:进程是动态的,是程序的一次执行过程。程......
  • Flask, Django - 区别
    Python测试开发中Django和Flask框架为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用、系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后一块砖一块砖叠上去。而开发一个应用呢?同样也需要一个好的架构设计,数据库建模,然后一个模块一个模块......
  • pycharm创建django 开发环境
    因为用了pycharm社区版本没有办法图形界面创建django项目本机的环境需要有djangodjango-adminstartprojectmysite然后进入到mysite目录cdmysitepython-mvenvvenvpipinstalldjango配置pycharm启动项目......
  • golang实现设计模式之构建者模式总结-代码、优缺点、适用场景
    构建者模式也是一种创建型的设计模式,该模式将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的对象。大白话就是,构建者模式,从输出角度看依然是创建个对象实例,但是构建者模式更关注创建的细节,或者说一个对象的创建可以拆分为多个步骤,所有的步骤完成才创建出这个对......
  • django.db.utils.integrityerror: (1048, "Column 'phone' cannot be null")
    1背景:模型表中字段为:phone=models.CharField(default='',max_length=64,verbose_name=u'电话',blank=True) 2分析:在保存模型实例时,‘phone’被设置为空值.但是该字段在数据库中被设置为(NOTNULL),因此导致完整性约束错误. blank=True,在Django模型验证中,......
  • Django模型字段default='' 含义
    是Django模型字段定义中一个参数,用于指定模型字段的默认值. 详细解释:在创建新的模型实例时,若没有为phone字段提供具体的值,那么该字段将被默认设置为空字符串. 例:my_object=MyModel.objects.create(name='John'),中没有为phone字段提供具体值,所以phone字段将被设......
  • Go Web
    GoWeb主要介绍Go的net/http包,Gin框架,gRPC。(多复习,多回顾,多输出)参考:Gohttp包详解-简书(jianshu.com)【置顶】Go语言学习之路/Go语言教程|李文周的博客(liwenzhou.com)net/Http包Go语言中的http包提供了创建http服务或者访问http服务所需要的能力,不需要额外......