go:多任务线程池并发 1

Go 的并发与并行:深入解析 Goroutines 与 Worker Pool 模式的异同与最佳实践 Go语言凭借Goroutines和Channels实现高效的并发编程。Goroutines作为轻量级线程,适合处理简单并发任务,但缺乏任务管理机制。WorkerPool模式通过固定数量工作线程和任务队列,能有效控制并发度,适合处理大规模任务。两种模式各有优劣:Goroutines简单易用但不易管理,WorkerPool更复杂但资源控制更好。开发者应根据任务量大小和并发需求选择合适的模式,轻量任务用Goroutines,复杂任务推荐WorkerPool,以充分发挥Go语言的并发优势。 阅读详情

需求来源

原本有一个单线程执行器,用来执行多任务计算,但是单线程执行并没有很好利用系统多核 CPU 资源的优势。于是,需要把执行器改成并发执行的执行器。
首先,有一点需要明确的是,需要的进行计算的多任务并不是一次就抛出来的。这是一个实际中遇到的真实的情况。
任务的来源,是一个单线程的计算结果,至于单线程内部做了什么事情,这里不需要关心,重要的是该单线程的返回结果,如果不抛出异常,有可能可以返回多个可并发执行的任务,也可能一个任务也不会返回,但是下一次在执行单线程,有可能能返回可并发执行任务。
这是因为前面一个批次的某个任务或者某几个任务包含后面任务需要的关键输入参数、如果参数得不到满足、单线程不会将任务抛出。只有当任务需要的关键参数全部满足,单线程才会将任务抛出来。
当任务被单线程抛出之后,需要充分调动多核CPU资源的优势,进行并行计算,同时又要作出限制,不能随便就出现内存溢出这种情况。
所以,构造线程池就成为了解决方案之一。

构造方案

// 定义线程池
type HashSyncWorker struct {
    workerCount uint32
    workers map[uint32]*SyncWorker
}

// 创建 workers 个线程,并给每个线程创建一个 goroutine
// 每个 goroutine 监听一个 channel ,并给channel 设置缓冲区大小为 size 
func NewHashSyncWorker(workers uint32, size int) *HashSyncWorker {
    hashWorker := &HashSyncWorker {
        workerCount: workers,
        workers: make(map[uint32]*SyncWorker),
    }
    var i uint32
    for i = 0; i < workers; i ++ {
        hashWorker.workers[i] = NewSyncWorker(size, 1)
    }

    return hashWorker
}

func _hashStrToInt(s string) uint32 {
    h := fnv.New32a()
    h.Write([]byte(s))
    return h.Sum32()
}

// 将任务以 hash 方式投入线程池
func (syncer *HashSyncWorker)IssueOperation(key string, data interface{}, fn func(interface{})error,
    sync bool, timeout int) error {
    workerIndex := _hashStrToInt(key) % syncer.workerCount

    return syncer.workers[workerIndex].IssueOperation(data, fn, sync, timeout)
}

type syncWorkTask struct {
    fn func(interface{}) error
    data interface{}
    sync bool
    resp chan bool
    err error
}

type SyncWorker struct {
    tasks chan *syncWorkTask
    lock sync.Mutex
}

func NewSyncWorker(size int, workers int) *SyncWorker {
    syncer := &SyncWorker{
        tasks: make(chan *syncWorkTask, size),
        busy: false,
    }

    for i := 0; i < workers; i ++ {
        go func() {
            var task *syncWorkTask = nil
            for {
                task = <- syncer.tasks
                syncer.HandleTask(task)
                task = nil
            }
        }()
    }

    return syncer
}

func (syncer *SyncWorker)IssueOperation(data interface{}, fn func(interface{})error, sync bool, timeout int) error {

    task := &syncWorkTask {
        data: data,
        fn: fn,
        sync: sync,
    }

    if sync {
        task.resp = make(chan bool, 1)
    } else {
        task.resp = nil
    }

    syncer.tasks <- task

    if sync {
        if timeout > 0 {
            select {
            case <- time.After(time.Duration(timeout) * time.Second):
                return errors.New("The sync operation is timeout")
            case <- task.resp:
                return task.err
            }
        } else {
            <- task.resp
            return task.err
        }
    }

    return nil
}

任务投递及结果

采用了线程池,并且任务通过hash 方式向线程池投递,但是,仅仅只是向线程池进行任务投递,而没有进行任务计算结果分析进行回调。只算是完成了高并行运算,持续改进中。

Go 语言并发模型解析 作者:禅与计算机程序设计艺术 1.简介 1.什么是 Go 语言 Go 语言(官网):https://golang.org/ Go 是 Google 开发的一个开源编程语言,它的设计哲学在 阅读详情

相关推荐

Go必知必会系列:并发模式与锁

Golang作为一种静态编译型语言,其编程模型中并不提供像Java、C++那样的基于运行时特性来控制线程或并行的机制。相反,它提供了一套并发模型——基于channel的并发模型,并通过关键字go语言的协程机制来实现对协同式多任务的支持。协程的特点是轻量级的线程,但却不是真正的并行线程,它们之间共享内存空间,因此在一些需要同时访问数据的场景下可能会出现竞争条件的问题,而采用锁机制来避免竞争条件则又是一个复杂又耗时的过程。

AI天才研究院 450

go 线程池

go 线程池

云满笔记 809

Go必知必会系列:并发编程与Goroutines

作者:禅与计算机程序设计艺术 1.简介 1.1为什么要学习并发编程? 目前,多核CPU已经成为计算设备最主要的硬件之一了。这意味着可以同时执行多个任务,使得计算机处理任务的效率得到提升。但是,当线程数量增加到几千甚至上万时,管理线程切换、调度等任务

AI天才研究院 1645

线程池详解并使用Go语言实现 Pool

在线程池中存在几个概念:核心线程数最大线程数任务队列。与其他池化技术不同的是,线程池是基于生产者-消费者模式来实现的。

面向生活编程 2239

波束形成算法:LCMV实现(MATLAB)

阵列信号处理,波束成形,

weixin_43601588的博客 1万+

Unity中基于SkinMeshRenderer的骨骼动画换装系统优化实践

本文深入探讨了Unity中基于SkinnedMeshRenderer的骨骼动画换装系统优化实践。针对换装卡顿、显示错误等常见问题,文章剖析了SkinnedMeshRenderer的核心数据原理,对比了“数据替换”与“实体替换”两种主流方案的性能差异,并详细阐述了通过骨骼字典缓存、对象池管理、材质合并与Draw Call优化等实战技巧,构建高性能、高稳定性的生产级换装系统。

weixin_29008055的博客 314

GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程

用一些示例介绍了Worker Pools线程池、Select语句、Metex互斥锁运行流程及结果

主要发布一些日常学习代码及理解 1552

PC微信逆向) 读取内存联系人链表

首先从一些网络上搜索到的信息可以得出联系人列表是保存在内存里的,并且是全局变量不会被释放,所以我们可以通过搜索某个联系人的信息来定位

Qwertyuiop2016的博客 2921

Go:goroutine线程池 ants 简介与实践

github地址: https://github.com/panjf2000/antsants是一个高性能的 goroutine 池,实现了对大规模 goroutine 的调度管理、goroutine复用,允许使用者在开发并发程序的时候限制goroutine数量,复用资源,达到更高效执行任务的效果。自动调度海量的 goroutines,复用 goroutines定期清理过期的 goroutines,进一步节省资源。

GIS摆渡人 1729

来!简单了解一下计算机发展史!

​ 1936年,英国数学家阿兰・麦席森・图灵提出了一种抽象的计算模型——图灵机( Turing machine)。图灵机,又称图灵计算机,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。​ 图灵机是一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。

m0_57290404的博客 2910

模拟调制系统实战:从AM到FM的5种调制方式对比与选型指南

本文深度解析AM、DSB、SSB、VSB、FM五种经典模拟调制方式,从实现电路、频谱效率、抗噪性能及工程成本等维度进行实战对比。通过MATLAB/Simulink仿真案例,提供清晰的选型决策框架,帮助工程师在无人机图传、短波通信、广播系统等具体项目中,根据带宽、功耗和抗干扰需求选择最优方案。

study的专栏 934

Golang线程池

Golang线程池

深漂小码哥 398

YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南

飞书链接:https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。函数中添加BiFPN的解析逻辑(找到。链接可用,不要多复制空格了。密码:946m22&8。

FJN110的博客 308

golang高并发特性goroutine介绍

在具体说goroutine使用方法之前,先介绍下其基本原理和相关概念,如果只是想知道如何使用,直接跳到第二节。首先介绍下介个概念并发、进程、线程和携程。并发的概念在很早之前,计算机只有单核心,开发语言冶金本上是按照顺序书写代码逻辑,用户一次直接能提交一个作业,计算机同时只能做一件事。但是随着计算机技术的发展,软件设计越来越复杂,以及CPU/内存/硬盘等IO速度的巨大差异造成的读写等待,这种单进程顺序执行的方式,无法满足场景应用。goroutine原理https。.........

技术控的笔记 16万+

Aurix TC3xx系列MCU ADC模块简介(一)

简单介绍英飞凌Aurix TC3xx系列单片机ADC模块的特点及内部结构。

m0_38045338的博客 6362

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Go routine线程池&&并发场景

欢迎来到我的博客,更多文章点击这里 并发,并行,串行 部分参考节选自优快云博客: 通俗理解: 吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的) 吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。 普通解释: 并发:交替做不同事情的能力 并行:同时做不同事情的能力 专业术语: 并发:不同的代码块交替执行 并行:不同的代码块.

weixin_44154094的博客 405

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Golang】并发

并发 有人把Go语言比作 21 世纪的C语言 第一是因为Go语言设计简单 第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制 先来了解一些概念: 进程/线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位 线程是进程的一个执行实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位 一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行 并发/并行 多线程程序在单核心的 cpu 上运

Suk_god的博客 691

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Golang之并发编程

1 并发概述 并发编程是指在一台处理器上“同时”处理多个任务,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 宏观的并发是指在一段时间内,有多个程序在同时运行。 并发在微观上,是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个程序快速交替的执行。 2 什么是并发?...

franky专栏 420

Go并发编程——goroutine(下)

有哪些编程语⾔应⽤到了协程呢? 1. Lua语⾔ Lua从5.0版本开始使⽤协程,通过扩展库coroutine来实现。 2. Python语⾔ python可以通过 yield/send 的⽅式实现协程。在python 3.5以后,async/await 成为了更好的替代⽅案。 3. Go语⾔ Go语⾔对协程的实现⾮常强⼤⽽简洁,可以轻松创建成百上千个协程并发执⾏。 4. Java语⾔ Java语⾔并没有对协程的原⽣⽀持,但是某些开源框架模拟出了协程的功能,例如:Kilim框架。

DTCloud 1271

2023 年最新 Go 语言 goroutine 并发编程详细教程(更新中)

OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB),一个goroutine的栈在其生命周期开始时只有很小的栈(典型情况下2KB),goroutine的栈不是固定的,可以按需增大和缩小,goroutine的栈大小限制可以达到1GB,虽然极少会用到这个大。大概意思就是本来计划的好好的周末出去烧烤,但是你妈让你去相亲,两种情况第一就是你相亲速度非常快,见面就黄不耽误你继续烧烤,第二种情况就是你相亲速度特别慢,见面就是你侬我侬的,耽误了烧烤,但是还馋就是耽误了烧烤你还得去烧烤。那么协程的任务就完成了。

唤醒手腕 759

golang协程goroutine

协程goroutine 概念 协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。根据维基百科的记录,协程术语coroutine最早出现在1963年发表的论文中,论文作者是美国计算机科学家马尔文·爱德华·康威。 协程并不是Go发明的概念,支持协程的编程语言有很多,比如python、pe

Steven的专栏 1900

Java线程 VS Golang协程

Java线程 VS Golang协程

xiao44_java的专栏 2127

【早晨读书会】深入理解rust并发编程

线程是调度的单位同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的SmallTalk、Ruby、Lua、Python 等,还会有协程(英语:coroutine)更小的调度单位。协程非常类似于线程。但是协程是的,而线程典型是的。这意味着协程提供并发性而非并行性。Rust 实现并发的基本单位是线程Rust 标准库std::thread crate 提供了线程相关的函数。

qq_54384621的博客 1665

Go vs Java 性能终极对决:谁才是高性能之王?

需求GoJava快速启动✅❌低内存占用✅❌高并发✅❌(依赖线程池优化)长期运行优化❌✅(JIT 编译优化)生态系统支持❌✅云原生、微服务✅❌企业级系统、金融、电商❌✅。

tenkofx的博客 3423

并发编程:起源

并发编程是为了解决多个任务共享资源、合理调度、提高响应与吞吐的一种程序设计方法,贯穿于操作系统、网络编程、大数据计算等各个领域。

怪味Coding 841
上一篇: centos7:安装配置 virtualbox 增强功能 VBoxGuestAdditions,并实现物理机脚本控制虚拟机
下一篇: docker:搭建私有仓库
github_37320188
博客等级 码龄10年 24粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值