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;

项目瓶颈期了…

目录
相关文章
|
3月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
3月前
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
|
缓存 Go
控制goroutine 的并发执行数量
控制goroutine 的并发执行数量
140 0
|
6月前
|
Java
线程数设置
线程数设置
71 0
goroutine+channel实现对多个goroutine的顺序执行
goroutine+channel实现对多个goroutine的顺序执行
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
160 0
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
|
Java
180724-统计JVM进程中线程数两种方式小记
/proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU、中断、内存、磁盘等等
563 0
180724-统计JVM进程中线程数两种方式小记
|
API C#
C#多线程(8):线程完成数
C#多线程(8):线程完成数
123 0
控制并发线程数的Semaphore
控制并发线程数的Semaphore
129 0