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;

项目瓶颈期了…

目录
相关文章
|
SQL 数据采集 存储
基于clickhouse做用户画像,标签圈选
基于clickhouse做用户画像,标签圈选
1850 0
基于clickhouse做用户画像,标签圈选
|
运维 监控 算法
从定时任务-到任务调度系统xxl-job
定时任务的今生前世以及xxl-job调度系统
3385 0
从定时任务-到任务调度系统xxl-job
|
10月前
|
存储 人工智能 自然语言处理
构建AI智能体:十七、大模型的幻觉难题:RAG 解决AI才华横溢却胡言乱语的弊病
RAG(检索增强生成)是一种结合信息检索与大型语言模型的技术,旨在解决LLM的幻觉问题。其核心流程包括:离线处理阶段(知识库构建)和在线处理阶段(用户查询应答)。通过将外部知识源转换为向量存入数据库,当用户提问时,系统会检索相关内容并增强提示,再由LLM生成准确答案。RAG技术显著提升了AI在专业领域的可靠性,适用于智能客服、企业知识管理、内容创作等场景。尽管面临检索精度、多模态处理等挑战,RAG仍是AI实用化的重要突破方向。
1289 2
|
8月前
|
存储 机器学习/深度学习 人工智能
大模型应用:LangChain核心组件深度解析:llms与embeddings.3
LangChain是构建大语言模型(LLM)应用的开源框架,核心包含LLMs(文本生成/对话)与Embeddings(文本向量化/语义检索)两大组件。其典型RAG架构实现“查询嵌入→向量检索→Prompt构建→LLM生成”闭环,支持文档问答等智能应用。(239字)
1614 8
|
10月前
|
存储 人工智能 自然语言处理
构建AI智能体:十八、解密LangChain中的RAG架构:让AI模型突破局限学会“翻书”答题
本文深入探讨了如何利用LangChain框架实现RAG(检索增强生成)架构,构建智能问答系统。文章首先介绍了RAG技术解决大模型知识更新和准确性问题的原理,以及LangChain作为开发框架提供的模块化组件。详细解析了LangChain的核心模块(模型、提示、索引、链等)和四种ChainType(stuff、map_reduce、refine、map_rerank)的特点与适用场景。通过一个完整的代码示例,展示了如何结合DeepSeek模型和FAISS向量数据库处理PDF文档,实现本地知识库问答功能
1343 9
|
10月前
|
存储 人工智能 监控
构建AI智能体:三十二、LangChain智能体:打造会使用工具(Tools)、有记忆(Memory)的AI助手
文章摘要:本文系统介绍了LangChain框架的核心组件与工作机制。LangChain是一个为大语言模型应用开发设计的开源框架,包含模型层、提示管理、处理链、记忆系统和代理机制五大核心组件。重点分析了Tools系统、Memory系统和ReAct框架的协同工作机制:Tools扩展模型能力,Memory存储对话历史,ReAct框架实现智能推理与行动决策。通过多工具智能体示例,展示了三者如何协同完成复杂任务(如计算年龄平方根、网页内容提取等)。
1886 1
|
存储 容灾 NoSQL
同城双活的必修课 - 落地经验与关键挑战解析
同城双活作为一种容灾架构,通过在同一城市建立两个数据中心,以确保在一个数据中心发生故障时,系统能够快速切换到另一个数据中心,从而提高系统的可用性
2271 2
同城双活的必修课 - 落地经验与关键挑战解析
|
消息中间件
使用RabbitMQ如何保证消息不丢失 ?
消息从发送,到消费者接收,会经理多个过程 , 其中的每一步都可能导致消息丢失 针对这些问题,RabbitMQ分别给出了解决方案: ● 消息发送到交换机丢失 : 发布者确认机制publisher-confirm消息发送到交换机失败会向生产者返回ACK , 生产者通过回调接收发送结果 , 如果发送失败, 重新发送, 或者记录日志人工介入 ● 消息从交换机路由到队列丢失 : 发布者回执机制publisher-return消息从交换机路由到队列失败会向生产者返回失败原因 , 生产者通过回调接收回调结果 , 如果发送失败, 重新发送, 或者记录日志人工介入 ● 消息保存到队列中丢失 : MQ持久化(交
|
存储 监控 Java
Go Goroutine 究竟可以开多少?(详细介绍)
Go Goroutine 究竟可以开多少?(详细介绍)
489 3
|
存储 缓存 NoSQL
Redis Quicklist 竟让内存占用狂降50%?
【10月更文挑战第11天】
572 2