Goroutine 最大数量的限制

简介: Goroutine 最大数量的限制

前言


最近有个朋友, 刚入职没多久就被组长叼了, 原因是他在业务场景中开Goroutine导致测试服务器资源占用过大, 其他服务都崩了…


场景类似于监听区块链交易, 对每个区块进行轮询处理每笔交易, 他直接循环开Goroutine处理每笔交易, 数据大了goroutine开的太多导致资源占用过大, 导致了这场悲剧;


工作中我们需要开Goroutine来提高代码处理的效率, 但也不能滥用, 需要对它进行一定限制, 保证资源占用在可控范围内, 所以我们需要对项目中Goroutine的数量进行限制, 用channel就可以很好的做到;


正文


直接上代码

gopool

package gopool
import "sync"
type Pool struct {
  wg    sync.WaitGroup
  queue chan struct{}
}
// NewGoPool 实例化一个go程池
func NewGoPool(i int) *Pool {
  if i < 1 {
    i = 1
  }
  return &Pool{queue: make(chan struct{}, i)}
}
// Add 添加
func (p *Pool) Add() {
  p.queue <- struct{}{}
  p.wg.Add(1)
}
// Done 释放
func (p *Pool) Done() {
  p.wg.Done()
  <-p.queue
}
// Wait 等待
func (p *Pool) Wait() {
  p.wg.Wait()
}

test

package gopool
import (
  "fmt"
  "runtime"
  "testing"
  "time"
)
func TestNewGoPool(t *testing.T) {
  defaultNum := runtime.NumGoroutine()
  p := NewGoPool(2)
  for i := 0; i < 100; i++ {
    p.Add()
    go func() {
      defer p.Done()
      time.Sleep(1 * time.Second)
      fmt.Println("go routine num: ", runtime.NumGoroutine()-defaultNum)
    }()
  }
  p.Wait()
  fmt.Println("go routine num: ", runtime.NumGoroutine())
}


代码都在我的个人项目 fly 中, 里面封装了一些常用的组件和应用示例, 欢迎大家 star / 提 Issues;

项目瓶颈期了…

目录
打赏
0
0
0
0
8
分享
相关文章
docker 安装 mysql 并映射数据库存放路径及配置文件
本文是博主学习docker镜像的记录,希望对大家有所帮助。
4388 0
docker 安装 mysql 并映射数据库存放路径及配置文件
|
10月前
|
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
208 4
Go Goroutine 究竟可以开多少?(详细介绍)
Go Goroutine 究竟可以开多少?(详细介绍)
173 3
AI技术在医疗领域的应用与前景####
本文深入探讨了人工智能(AI)技术在医疗健康领域中的多维度应用,从疾病诊断、个性化治疗到健康管理,展现了AI如何革新传统医疗模式。通过分析当前实践案例与最新研究成果,文章揭示了AI技术提升医疗服务效率、精准度及患者体验的巨大潜力,并展望了其在未来医疗体系中不可或缺的地位。 ####
【AI大模型】Transformers大模型库(二):AutoModelForCausalLM
【AI大模型】Transformers大模型库(二):AutoModelForCausalLM
332 1
【面试宝藏】Go并发编程面试题
探索Go语言并发编程,涉及Mutex、RWMutex、Cond、WaitGroup和原子操作。Mutex有正常和饥饿模式,允许可选自旋优化。RWMutex支持多个读取者并发,写入者独占。Cond提供goroutine间的同步,WaitGroup等待任务完成。原子操作保证多线程环境中的数据完整性,sync.Pool优化对象复用。了解这些,能提升并发性能。
258 2
docker swarm 集群服务编排部署指南(docker stack)
docker swarm 集群服务编排部署指南(docker stack)
1383 0
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
330 0
数据库存储选型经验总结
工作中总是遇到数据存储相关的Bug工单,新需求开发设计中也多多少少会有数据模型设计和存储相关的问题
2778 0
数据库存储选型经验总结
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问