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;

项目瓶颈期了…

目录
相关文章
|
JavaScript 关系型数据库 测试技术
接口文档管理神器RAP2安装和部署
一 RAP2 RAP2是在RAP1基础上重做的新项目,它包含两个组件(对应两个Github Repository)。 rap2-delos: 后端数据API服务器,基于Koa + MySQLlink rap2-dolores: 前端静态资源,基于React link 什么是RAP? rap是一款API 文档管理工具,在 RAP 中,可以定义接口的 URL、请求 & 响应细节格式等等。
13738 0
|
存储 SQL 分布式计算
用户画像系列—如何从0到1建设用户画像
用户画像系列—如何从0到1建设用户画像
376 0
|
SQL 数据采集 存储
基于clickhouse做用户画像,标签圈选
基于clickhouse做用户画像,标签圈选
1532 0
基于clickhouse做用户画像,标签圈选
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
存储 监控 Java
Go Goroutine 究竟可以开多少?(详细介绍)
Go Goroutine 究竟可以开多少?(详细介绍)
253 3
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
AI技术在医疗领域的应用与前景####
本文深入探讨了人工智能(AI)技术在医疗健康领域中的多维度应用,从疾病诊断、个性化治疗到健康管理,展现了AI如何革新传统医疗模式。通过分析当前实践案例与最新研究成果,文章揭示了AI技术提升医疗服务效率、精准度及患者体验的巨大潜力,并展望了其在未来医疗体系中不可或缺的地位。 ####
|
运维 网络协议 调度
docker swarm 集群服务编排部署指南(docker stack)
docker swarm 集群服务编排部署指南(docker stack)
1690 0
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
295 2
|
存储 监控 NoSQL
定时任务数量爆炸?Netty教你如何应对百万级挑战
【9月更文挑战第4天】在一项在线出题系统项目中,每位用户需按顺序回答十道题,每题有时间限制,服务器需生成十个定时任务以确保题目按时推送。随着用户增加,传统JDK Timer表现出性能瓶颈,系统响应变慢。采用Netty的HashedWheelTimer后,通过其高效的时间轮机制,将定时任务的存取复杂度降至O(1),实现了在50万级别任务下的稳定运行。多级时间轮结合持久化存储进一步提升了系统的精度和稳定性,但也带来了一些配置和管理上的挑战,需不断优化调整。
235 11
|
运维 Kubernetes 关系型数据库
云计算运维工程师面试技巧
【8月更文挑战第6天】
1198 1