当前位置: 首页 > news >正文

golang协程池库tunny实践

前言
线程池大家都听过,其主要解决的是线程频繁创建销毁带来的性能影响,控制线程数量。

go协程理论上支持百万协程并发,协程创建调度的消耗极低,但毕竟也是消耗对吧。

而且协程池可以做一些额外的功能,比如限制并发,定时等功能。

tunny中的协程池实现的几个功能,一个是限制并发,另一个是能根据协程上下文中断协程处理。同时能在协程处理过程中能做一些额外逻辑,算是装饰器吧。

简单示例
我们首先通过一个简单的例子来看这个协程池怎么使用,根据这个例子来一步步看源码。

    pool := tunny.NewFunc(10, func(in interface{}) interface{} {
        intVal := in.(int)
        fmt.Println(intVal)
        return intVal * 2
    })
    defer pool.Close()

    for i := 0; i < 10; i++ {
        ret := pool.Process(i)
        fmt.Println(ret)
    }

上例中,通过tunny.NewFunc 创建了一个容量为10的协程池,第二个参数定义了协程的处理方法,在下面的循环中,通过pool.Process(i) 调用了定义的方法,这个例子已经包含了协程池的创建和调度,来看看这两个是怎么实现的。

其他实践:

 

tunny vs ants

tunny设计的思路与ants有较大的区别:

tunny只支持同步的方式执行任务,虽然任务在另一个 goroutine 执行,但是提交任务的 goroutine 必须等待结果返回或超时。不能做其他事情。正是由于这一点,导致tunny的设计稍微一点复杂,而且为了支持超时和取消,设计了多个通道用于和执行任务的 goroutine 通信。一次任务执行的过程涉及多次通信,性能是有损失的。从另一方面说,同步的编程方式更符合人类的直觉。

ants完全是异步的任务执行流程,相比tunny性能是稍高一些的。但是也因为它的异步特性,导致没有任务超时、取消这些机制。而且如果需要收集结果,必须要自己编写额外的代码。

总结

本文介绍了另一个 goroutine 池的实现tunny。它以同步的方式来处理任务,编写代码更加直观,对任务的执行流程有更强的控制,如超时、取消等。当然实现也复杂一些。

 

http://www.lryc.cn/news/118866.html

相关文章:

  • Android性能优化—数据结构优化
  • STL模板——vector详解
  • 国际顶级学术会议ISSTA召开,中山大学与微众银行联合发表区块链最新研究成果
  • Android开发从0开始(图形与按钮)
  • Git入门到精通——保姆级教程(涵盖GitHub、Gitee、GitLab)
  • 题解 | #J.Permutation and Primes# 2023牛客暑期多校8
  • 用vim打开后中文乱码怎么办
  • 自然语言处理: 第六章Transformer- 现代大模型的基石
  • 01-Hadoop集群部署(普通用户)
  • DC电源模块关于的电路布局设计
  • MATLAB实现免疫优化算法(附上多个完整仿真源码)
  • 登录界面中图片验证码的生成和校验
  • go的make使用
  • 竞赛项目 深度学习实现语义分割算法系统 - 机器视觉
  • 一元三次方程求解
  • 基于java在线音乐网站设计与实现
  • Python爬虫如何更换ip防封
  • 涛思数据联合长虹佳华、阿里云 Marketplace 正式发布 TDengine Cloud
  • 特殊符号的制作 台风 示例 使用第三方工具 Photoshop 地理信息系统空间分析实验教程 第三版
  • IoTDB1.X windows运行失败问题的处理
  • pdf转图片【java版实现】
  • python3.6 安装pillow失败
  • 巨人互动|Meta海外户Meta的业务工具转化API
  • 【JAVA】包、权限修饰符、final关键字、常量、枚举、抽象类、接口
  • 6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6
  • 项目实战 — 消息队列(7){虚拟主机设计(2)}
  • 手把手教你快速实现内网穿透
  • 【Linux取经路】揭秘进程的父与子
  • iOS链式编程风格 -- 富文本字符串
  • 后端开发5.Redis的搭建