一个简单的goroutine pool

goroutine pool的简单实现 goroutine pool的简单实现golang web server原理粗糙版本的goroutine pool升级版 goroutine pool 这篇文章从go提供的web server的出发,理解go web server的实现方式,提出goroutine pool的重要性,然后自己实现一个简单版本的goroutine pool golang web server原理 我们先来看一个非... 阅读详情
package main

import (
	"fmt"
	"runtime"
	"strings"
	"sync"
)

type GoPool struct {
	Queue    chan func() (interface{}, error)
	PoolSize int //goroutine数量

	finishCallback func(interface{}, error)
}

//初始化
func (self *GoPool) Init(pool_size, task_size int) {
	self.Queue = make(chan func() (interface{}, error), task_size)
	self.PoolSize = pool_size
}

//start
func (self *GoPool) Start() {
	//开启PoolSize个goroutine
	for i := 0; i < self.PoolSize; i++ {
		go func() {
			for {
				task, ok := <-self.Queue
				if !ok {
					break
				}
				self.finishCallback(task())
			}
		}()
	}
}

//stop
func (self *GoPool) Stop() {
	close(self.Queue)
}

//添加任务
func (self *GoPool) AddTask(task func() (interface{}, error)) {
	self.Queue <- task
}

//设置callback
func (self *GoPool) SetFinishCallback(callback func(interface{}, error)) {
	self.finishCallback = callback
}

func main() {
	//打印CPU核数
	fmt.Println("cpu nums:", runtime.NumCPU())
	//设置最多使用CPU数量
	runtime.GOMAXPROCS(runtime.NumCPU())

	arr := []string{
		"ab/cd/ef",
		"11/22/33",
		"rr/qq/33",
		"vv/hh/mm",
	}

	pool := new(GoPool)
	pool.Init(3, len(arr))

	//使用WaitGroup控制同步
	var wg sync.WaitGroup
	for i := range arr {
		wg.Add(1)
		str := arr[i]
		pool.AddTask(func() (interface{}, error) {
			return split(str)
		})
	}

	//设置callback
	pool.SetFinishCallback(func(res interface{}, err error) {
		fmt.Println("res:", res)
		if err != nil {
			fmt.Println("err:", err)
		}
		wg.Done()
	})

	pool.Start()

	wg.Wait()

	pool.Stop()

	fmt.Println("finished...")
}

func split(str string) ([]string, error) {
	return strings.Split(str, "/"), nil
}


Fasthttp里面 goroutine pool 实现原理 Fasthttp里面 goroutine pool 实现原理应用实例源码分析调用链路分析workerPool 的 start 和 stopworkerPool 的 Serve逻辑架构图 这篇文章主要讲解fasthttp 这个http库关于协程池做的优化原理; 应用实例 fasthttp 是一个非常优秀的web server框架,github上的benchmark号称比官方的net/http快1... 阅读详情

相关推荐

Go 并发入门:从 goroutine 到 worker pool

并发编程是现代后端开发中不可或缺的能力。Go 语言(Golang)的设计哲学里,并发是“一等公民”。。本文将通过几个循序渐进的示例,从基础到应用,带你理解 Go 的并发核心。

lpfasd123的博客 474

Go 语言:GoRoutines Pool 库详解

Go 语言通过 GoRoutines 实现并发,GoRoutines 是轻量级的线程,由 Go 语言的运行时环境(runtime)进行调度。使用 GoRoutines 可以更方便地实现并发编程,但在某些场景下,我们需要对并发任务的数量进行限制,这就是 GoRoutines Pool 的用武之地。

m0_62153576的博客 423

pytorch实现手语识别

连续手语识别项目,中文数据集CSL

masteryi-0018的博客 1万+

Golang goroutine pool 的实现

Golang 语言很好的支持高并发场景,goroutine相比java的thread开销更小。但是大量的goroutine会带来内存开销,如果无限的创建goroutine则会出现内存溢出的灾难,所以萌生出了goroutine pool 的想法,仿照java中的ThreadPoolExecutor实现一个简单的Golang 版本的协程池。代码如下: package goroutine_pool i...

zhumingyuan111的博客 983

InfiniBand(IB)实战指南:从硬件配置到性能优化

本文是一份详尽的InfiniBand实战指南,涵盖从硬件选型、部署到驱动配置、性能优化的全流程。重点解析了InfiniBand作为AI训练与高性能计算(HPC)核心网络的优势,特别是其支持的RDMA技术如何实现微秒级低延迟。文章提供了硬件匹配、NCCL压测、内核参数调优及在PyTorch分布式训练中启用IB的实操步骤,旨在帮助工程师构建和优化高性能计算集群。

mqtt6iot的博客 581

OpenSceneGraph编译、安装、开发环境

详细描述WIndows 10下使用Visual Studio 2019编译OpenSceneGraph 3.6.5的操作流程

国产CAx(CAD/CAE/CAM)软件研发 8772

golang工作者goroutine池模型

在golang编写服务程序过程中,如果每次来斗启动一个goroutine去处理任务,处理一个任务后就退出,这样势必会造成资源浪费。构建一个工作goroutine池来处理任务相对资源利用会少些,具体的情况需对比测试。 列表内容 type WorkerPool struct { tasks <-chan *string //任务队列长度 poolSize int

qq_33204116的博客 3046

线性分类器(Linear Classifier)

线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两

xuechanba的博客 1万+

Go并发:使用sync.Pool来性能优化

它的主要用途是存储那些可以被复用的临时对象,以便在需要时快速获取,而不是每次都进行新的对象分配。可见,在多个goroutine的并发情况下,是安全,另外可以观察到,sync.Pool没有一直【Creating a new object】去New很多棋牌室。在之前的文章中有提到的享元模式设计模式:flyweight(享元)的在棋牌游戏的应用的案例。本文简述了sync.Pool的基础使用,以及了如何使用其对实践棋牌室游戏的案例进行优化过程。接着,通过一个简单的例子,来看看是如何使用的。

viviiuw的博客 290

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 383

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

【Golang 面试题】每日 3 题(四十二)

Goroutine 是 Go 语言中的一种轻量级线程实现,它可以在单个进程中同时执行多个任务,实现了并发编程。与传统的线程相比,Goroutine 的创建和切换开销非常小,因此可以轻松创建数以千计的 Goroutine,而不会导致系统资源的耗尽。Goroutine 的定义非常简单,只需要在函数调用前添加关键字 go 即可创建一个 Goroutine。")在这个例子中,我们创建了一个 Goroutine 来执行 sayHello() 函数,使用关键字 go 来启动 Goroutine。

Newin2020的博客 548

基于uniapp实现自定义日历页面、年份月份选择、动态日历渲染、日期标记及备忘录、无组件依赖、多端兼容

基于UniApp框架下自定义日历组件的完整实现方案,涵盖基础日历渲染、年月选择器集成、动态数据标记等核心功能。提供完整代码段,帮助开发者快速构建高性能、高定制化的日历模块,适用于日程管理、预订系统等场景。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

如何实现一个协程池?核心讲解

在 Golang 中要创建一个协程是一件无比简单的事情,你只要定义一个函数,并使用 go关键字去执行它就行了。如果你接触过其他语言,会发现你在使用使用线程时,为了减少线程频繁创建销毁还来的...

slphahaha的博客 413

RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入

RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入,结合Developer实现

weixin_42412049的博客 1810

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

gorouting使用

1.起固定個數的goroutine package utils import ( "sync" ) type pool struct { queue chan int wg *sync.WaitGroup } func New(size int) *pool { if size <= 0 { size = 1 } return &pool{ queu...

Madison001的博客 67

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

探索GoCarol:一个高效且灵活的并发工具库

探索GoCarol:一个高效且灵活的并发工具库 项目简介 是一个基于Go语言的轻量级并发工具库,由郭巍 Gong 创建并维护。这个项目旨在提供简单易用的接口,帮助开发者更好地管理并发任务,提高代码的可读性和执行效率。 技术分析 GoCarol 的核心是其对Go语言内置的goroutine和channel机制的巧妙利用。它提供了一系列实用的函数和类型,包括: Pool:一个线程池实现,可以预定义一...

gitblog_00095的博客 406

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Golang异步编程方式和技巧

注意:sync.Mutex 的锁是不可以嵌套使用的 sync.RWMutex 的 RLock()是可以嵌套使用的 sync.RWMutex 的 mu.Lock() 是不可以嵌套的 sync.RWMutex 的 mu.Lock() 中不可以嵌套 mu.RLock()可以使用context.WithCancel()创建一个可取消的上下文,并使用context.WithTimeout()创建一个带有超时的上下文。time.Tick()函数返回一个通道,定期发送时间值,可以用于执行定时操作。使用匿名函数传递参数。

Code365 696

golang协程数量控制

协程数量控制 在Golang中,Goroutine虽然很好,但是数量太多了,往往会带来很多麻烦,比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来。所以我们可以限制下Goroutine的数量,这样就需要在每一次执行go之前判断goroutine的数量,如果数量超了,就要阻塞go的执行。第一时间想到的就是使用通道。每次执行的go之前向通道写入值,直到通道满的时候就阻塞了. pack...

Madison001的博客 234

Go并发编程:从Goroutine到Work Pool的进阶之路

从Goroutine到Work Pool的进阶之路,体现了Go并发编程的优雅:从简单启动任务,到通道同步,再到池化优化。$$ \text{吞吐量} \approx \min(k, \text{CPU核心数}) \times \text{任务处理率} $$这解决了资源竞争问题,但任务量 $m$ 过大时,Goroutine数量 $k$ 固定可能导致瓶颈。$$ \text{吞吐量} = \frac{\text{完成任务数}}{\text{总时间}} $$其中,$k$ 是工作者数,合理设置能最大化资源利用率。

kkshdgxcjsd的博客 530

Goroutine Pool模型

研究一下大神的goroutine pool的实现 https://www.cnblogs.com/williamjie/p/9267741.html 设计思路 启动服务之时先初始化一个 Goroutine Pool 池,这个Pool维护了一个类似栈的LIFO队列 ,里面存放负责处理任务的Worker,然后在client端提交task到Pool中之后,在Pool内部,接收task之后的核心操作...

大魔王 1102

如果裸写一个goroutine pool

引言在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。12345678func myHandler(w http.ResponseWriter, r *http.Request) {  ...

嘿嘿 152

Go并发编程:goroutine与channel实战指南

并发编程是现代软件开发的核心技术,通过多任务并行执行提升系统吞吐量。Go语言采用独特的goroutine实现轻量级并发,每个goroutine初始仅需2KB栈空间,由运行时系统智能调度。配合channel实现CSP通信模型,开发者无需处理传统线程锁的复杂性。在微服务和高并发场景中,合理使用worker pool和pipeline模式能显著提升性能。通过sync包的Mutex、WaitGroup等原语,可解决资源共享和协同问题。实际工程需注意避免goroutine泄漏和竞态条件,结合-race检测和pprof

weixin_30566111的博客 489

【Go】Goroutine 池

文章目录一、为什么需要 Goroutine 池?二、Goroutine 池是什么?三、怎么实现 Goroutine 池?1. Goroutine 池只是一个抽象的概念2. Goroutine 池的设计思路3. 生产者消费者模型四、一个实现 Goroutine 池的实例五、一个 Goroutine 池的实践 —— ants六、总结参考链接 一、为什么需要 Goroutine 池? 试想这样一种情况,如果给每个客户端都分配一个 session 来维护连接,然后每个 session 会启动3个 goroutin

weixin_44211968的博客 3145
上一篇: 使用rbenv管理ruby版本
下一篇: go语言按行读取文件
CSTO
博客等级 码龄17年 3粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值