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
}
相关推荐
Go 并发入门:从 goroutine 到 worker pool
并发编程是现代后端开发中不可或缺的能力。Go 语言(Golang)的设计哲学里,并发是“一等公民”。。本文将通过几个循序渐进的示例,从基础到应用,带你理解 Go 的并发核心。
Go 语言:GoRoutines Pool 库详解
Go 语言通过 GoRoutines 实现并发,GoRoutines 是轻量级的线程,由 Go 语言的运行时环境(runtime)进行调度。使用 GoRoutines 可以更方便地实现并发编程,但在某些场景下,我们需要对并发任务的数量进行限制,这就是 GoRoutines Pool 的用武之地。
pytorch实现手语识别
连续手语识别项目,中文数据集CSL
Golang goroutine pool 的实现
Golang 语言很好的支持高并发场景,goroutine相比java的thread开销更小。但是大量的goroutine会带来内存开销,如果无限的创建goroutine则会出现内存溢出的灾难,所以萌生出了goroutine pool 的想法,仿照java中的ThreadPoolExecutor实现一个简单的Golang 版本的协程池。代码如下: package goroutine_pool i...
InfiniBand(IB)实战指南:从硬件配置到性能优化
本文是一份详尽的InfiniBand实战指南,涵盖从硬件选型、部署到驱动配置、性能优化的全流程。重点解析了InfiniBand作为AI训练与高性能计算(HPC)核心网络的优势,特别是其支持的RDMA技术如何实现微秒级低延迟。文章提供了硬件匹配、NCCL压测、内核参数调优及在PyTorch分布式训练中启用IB的实操步骤,旨在帮助工程师构建和优化高性能计算集群。
OpenSceneGraph编译、安装、开发环境
详细描述WIndows 10下使用Visual Studio 2019编译OpenSceneGraph 3.6.5的操作流程
golang工作者goroutine池模型
在golang编写服务程序过程中,如果每次来斗启动一个goroutine去处理任务,处理一个任务后就退出,这样势必会造成资源浪费。构建一个工作goroutine池来处理任务相对资源利用会少些,具体的情况需对比测试。 列表内容 type WorkerPool struct { tasks <-chan *string //任务队列长度 poolSize int
线性分类器(Linear Classifier)
线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两
Go并发:使用sync.Pool来性能优化
它的主要用途是存储那些可以被复用的临时对象,以便在需要时快速获取,而不是每次都进行新的对象分配。可见,在多个goroutine的并发情况下,是安全,另外可以观察到,sync.Pool没有一直【Creating a new object】去New很多棋牌室。在之前的文章中有提到的享元模式设计模式:flyweight(享元)的在棋牌游戏的应用的案例。本文简述了sync.Pool的基础使用,以及了如何使用其对实践棋牌室游戏的案例进行优化过程。接着,通过一个简单的例子,来看看是如何使用的。
JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)
本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。
VMware17安装教程(附安装包)VMware17小白详细一键安装教程
VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。
【Golang 面试题】每日 3 题(四十二)
Goroutine 是 Go 语言中的一种轻量级线程实现,它可以在单个进程中同时执行多个任务,实现了并发编程。与传统的线程相比,Goroutine 的创建和切换开销非常小,因此可以轻松创建数以千计的 Goroutine,而不会导致系统资源的耗尽。Goroutine 的定义非常简单,只需要在函数调用前添加关键字 go 即可创建一个 Goroutine。")在这个例子中,我们创建了一个 Goroutine 来执行 sayHello() 函数,使用关键字 go 来启动 Goroutine。
基于uniapp实现自定义日历页面、年份月份选择、动态日历渲染、日期标记及备忘录、无组件依赖、多端兼容
基于UniApp框架下自定义日历组件的完整实现方案,涵盖基础日历渲染、年月选择器集成、动态数据标记等核心功能。提供完整代码段,帮助开发者快速构建高性能、高定制化的日历模块,适用于日程管理、预订系统等场景。
如何实现一个协程池?核心讲解
在 Golang 中要创建一个协程是一件无比简单的事情,你只要定义一个函数,并使用 go关键字去执行它就行了。如果你接触过其他语言,会发现你在使用使用线程时,为了减少线程频繁创建销毁还来的...
RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入
RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入,结合Developer实现
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...
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
探索GoCarol:一个高效且灵活的并发工具库
探索GoCarol:一个高效且灵活的并发工具库 项目简介 是一个基于Go语言的轻量级并发工具库,由郭巍 Gong 创建并维护。这个项目旨在提供简单易用的接口,帮助开发者更好地管理并发任务,提高代码的可读性和执行效率。 技术分析 GoCarol 的核心是其对Go语言内置的goroutine和channel机制的巧妙利用。它提供了一系列实用的函数和类型,包括: Pool:一个线程池实现,可以预定义一...
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()函数返回一个通道,定期发送时间值,可以用于执行定时操作。使用匿名函数传递参数。
golang协程数量控制
协程数量控制 在Golang中,Goroutine虽然很好,但是数量太多了,往往会带来很多麻烦,比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来。所以我们可以限制下Goroutine的数量,这样就需要在每一次执行go之前判断goroutine的数量,如果数量超了,就要阻塞go的执行。第一时间想到的就是使用通道。每次执行的go之前向通道写入值,直到通道满的时候就阻塞了. pack...
Go并发编程:从Goroutine到Work Pool的进阶之路
从Goroutine到Work Pool的进阶之路,体现了Go并发编程的优雅:从简单启动任务,到通道同步,再到池化优化。$$ \text{吞吐量} \approx \min(k, \text{CPU核心数}) \times \text{任务处理率} $$这解决了资源竞争问题,但任务量 $m$ 过大时,Goroutine数量 $k$ 固定可能导致瓶颈。$$ \text{吞吐量} = \frac{\text{完成任务数}}{\text{总时间}} $$其中,$k$ 是工作者数,合理设置能最大化资源利用率。
Goroutine Pool模型
研究一下大神的goroutine pool的实现 https://www.cnblogs.com/williamjie/p/9267741.html 设计思路 启动服务之时先初始化一个 Goroutine Pool 池,这个Pool维护了一个类似栈的LIFO队列 ,里面存放负责处理任务的Worker,然后在client端提交task到Pool中之后,在Pool内部,接收task之后的核心操作...
如果裸写一个goroutine pool
引言在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。12345678func myHandler(w http.ResponseWriter, r *http.Request) { ...
Go并发编程:goroutine与channel实战指南
并发编程是现代软件开发的核心技术,通过多任务并行执行提升系统吞吐量。Go语言采用独特的goroutine实现轻量级并发,每个goroutine初始仅需2KB栈空间,由运行时系统智能调度。配合channel实现CSP通信模型,开发者无需处理传统线程锁的复杂性。在微服务和高并发场景中,合理使用worker pool和pipeline模式能显著提升性能。通过sync包的Mutex、WaitGroup等原语,可解决资源共享和协同问题。实际工程需注意避免goroutine泄漏和竞态条件,结合-race检测和pprof
【Go】Goroutine 池
文章目录一、为什么需要 Goroutine 池?二、Goroutine 池是什么?三、怎么实现 Goroutine 池?1. Goroutine 池只是一个抽象的概念2. Goroutine 池的设计思路3. 生产者消费者模型四、一个实现 Goroutine 池的实例五、一个 Goroutine 池的实践 —— ants六、总结参考链接 一、为什么需要 Goroutine 池? 试想这样一种情况,如果给每个客户端都分配一个 session 来维护连接,然后每个 session 会启动3个 goroutin

474



被折叠的 条评论
为什么被折叠?



