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

GO Ants 学习

文章目录

      • 主要特性
      • 安装
      • 基本用法
        • 1. 创建协程池并提交任务
        • 2. 带返回值的任务提交
        • 3. 自定义协程池的参数
        • 4. 获取协程池状态
      • 应用场景
      • 优势
      • 资源释放
      • 性能对比
      • 总结

ants 是一个高性能的 Go 语言协程池库,专注于有效地管理 Go 协程的数量。它通过复用协程减少了创建和销毁协程带来的性能开销,特别适合在高并发场景下使用。相比于直接使用 Go 的原生协程, ants 提供了更细粒度的控制,并且可以极大减少内存消耗。

GitHub 仓库:ants

主要特性

  • 高性能:通过协程池技术减少内存分配,提升系统性能。
  • 自动伸缩:可以根据当前任务数动态调整池中协程数量。
  • 任务超时控制:支持为任务设置超时时间,超时未完成的任务可以被取消。
  • 多种提交任务方式:支持异步任务提交,带返回值的任务提交。
  • 资源复用:通过复用协程来避免频繁创建和销毁协程,节省系统资源。

安装

使用 go get 来安装 ants

go get -u github.com/panjf2000/ants

基本用法

1. 创建协程池并提交任务

通过 ants.NewPool 来创建一个具有固定大小的协程池。然后可以使用 Submit 方法向协程池中提交任务。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants"
)func main() {var wg sync.WaitGroup// 创建一个容量为 10 的协程池pool, _ := ants.NewPool(10)defer pool.Release() // 在程序结束时释放协程池资源// 提交任务到协程池for i := 0; i < 100; i++ {wg.Add(1)// 使用 Submit 方法提交任务pool.Submit(func() {time.Sleep(100 * time.Millisecond)fmt.Println("任务完成")wg.Done()})}// 等待所有任务完成wg.Wait()fmt.Println("所有任务已完成")
}
2. 带返回值的任务提交

除了简单的任务提交外,ants 还支持带返回值的任务。可以通过 ants.PoolWithFunc 创建协程池,并使用 Invoke 方法提交任务。

package mainimport ("fmt""sync""github.com/panjf2000/ants"
)func main() {var wg sync.WaitGroup// 创建带有返回值的协程池pool, _ := ants.NewPoolWithFunc(10, func(i interface{}) {fmt.Println(i)wg.Done()})defer pool.Release()// 提交任务for i := 0; i < 10; i++ {wg.Add(1)pool.Invoke(i) // 使用 Invoke 提交带有参数的任务}// 等待所有任务完成wg.Wait()fmt.Println("所有任务已完成")
}
3. 自定义协程池的参数

可以通过 NewPool 方法传入自定义参数,例如最大协程数量、超时时间等。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants"
)func main() {var wg sync.WaitGroup// 自定义协程池参数:最大协程数为 5,最大空闲时间为 10 秒pool, _ := ants.NewPool(5, ants.WithExpiryDuration(10*time.Second))defer pool.Release()for i := 0; i < 10; i++ {wg.Add(1)pool.Submit(func() {time.Sleep(1 * time.Second)fmt.Println("任务完成")wg.Done()})}wg.Wait()
}
4. 获取协程池状态

ants 提供了一些方法来获取协程池的状态,比如当前池中活跃的协程数量等。

fmt.Printf("运行中的协程数:%d\n", pool.Running())   // 获取正在执行任务的协程数量
fmt.Printf("协程池容量:%d\n", pool.Cap())            // 获取协程池的最大容量
fmt.Printf("空闲协程数:%d\n", pool.Free())           // 获取当前空闲的协程数量

应用场景

  • 高并发任务处理:通过协程池有效地管理并发任务数,避免大量协程占用过多资源。
  • 爬虫系统:可以用 ants 协程池并发处理多个请求,爬取网页数据,控制并发数避免对服务器产生过大压力。
  • 批量任务执行:适合批量处理任务的场景,比如图像处理、数据处理等。
  • 服务端请求处理:在高并发服务端应用中,ants 协程池可以帮助限制同时处理的请求数量,减少内存占用。

优势

  • 高性能:通过减少协程的频繁创建和销毁,ants 可以显著提升程序的执行效率。
  • 内存占用低:复用协程可以有效减少内存开销,尤其在高并发场景中表现尤为显著。
  • 自动伸缩:可以根据任务数动态调整协程数量,保证系统资源的最优利用。

资源释放

使用 ants 时,创建协程池后应该在使用完毕后调用 Release() 方法释放资源。

pool.Release()  // 在程序结束或不再需要时调用

性能对比

ants 在并发性能和内存使用上优于直接使用 Go 的原生协程。根据其官方的性能测试结果,ants 能显著减少 Goroutine 的创建和销毁带来的资源开销,特别是在高并发、大量短生命周期任务的场景下表现优秀。

总结

ants 是一个非常高效的 Go 协程池库,适合在高并发场景下进行任务调度和协程管理。通过它可以显著减少内存和 CPU 的消耗,同时提供了灵活的任务提交和管理方式,适用于各类并发任务处理的场景。

相关文章:

GO Ants 学习

文章目录 主要特性安装基本用法1. 创建协程池并提交任务2. 带返回值的任务提交3. 自定义协程池的参数4. 获取协程池状态 应用场景优势资源释放性能对比总结 ants 是一个高性能的 Go 语言协程池库&#xff0c;专注于有效地管理 Go 协程的数量。它通过复用协程减少了创建和销毁协…...

Scikit-learn (`sklearn`) 教程

Scikit-learn (sklearn) 教程 Scikit-learn 是 Python 中最流行的机器学习库之一&#xff0c;提供了丰富的机器学习算法、数据预处理工具以及模型评估方法&#xff0c;广泛应用于分类、回归、聚类和降维等任务。 在本教程中&#xff0c;我们将介绍如何使用 Scikit-learn 进行…...

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安&#xff0c; 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…...

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…...

django+vue

1. diango 只能加载静态js&#xff0c;和flask一样 2. 关于如何利用vue创建web&#xff0c;请查看flask vue-CSDN博客 3. 安装django pip install django 4. 创建新项目 django-admin startproject myproject 5.django 中可以包含多个app 5.1 创建一个app cd myprojec…...

HCIA--实验十七:EASY IP的NAT实现

一、实验内容 1.需求/要求&#xff1a; 通过一台PC&#xff0c;一台交换机&#xff0c;两台路由器来成功实现内网访问外网。理解NAT的转换机制。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.PC1配置ip地址及网关&#xff1a; 2.AR1接口配置ip地址&#xff1…...

彻底解决:QSqlDatabase: QMYSQL driver not loaded

具体错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMIMER QMARIADB QMYSQL QODBC QPSQL 检查驱动 根据不同安装目录而不同&#xff1a; D:\Qt\6.7.2\mingw_64\plugins\sqldrivers 编译驱动 如果没有&#xff0c;需要自行编译&…...

leetcode02——59. 螺旋矩阵 II、203. 移除链表元素

59. 螺旋矩阵 II class Solution {public int[][] generateMatrix(int n) {int[][] nums new int[n][n]; // 定义二维数组用于存储数据int startX 0; // 定义每循环一个圈的起始位置int startY 0;int loop 1; // 定义圈数&#xff0c;最少1圈int count 1; // 用来给矩阵中…...

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…...

docker 升级步骤

Docker 升级的步骤通常取决于你所使用的操作系统。以下是针对常见操作系统&#xff08;如 Ubuntu 和 CentOS&#xff09;的 Docker 升级步骤&#xff1a; Ubuntu 更新现有的包索引&#xff1a; sudo apt-get update 升级 Docker&#xff1a; 您可以运行以下命令来升级 Docker…...

828华为云征文 | 云服务器Flexus X实例:one-api 部署,支持众多大模型

目录 一、one-api 介绍 二、部署 one-api 2.1 拉取镜像 2.2 部署 one-api 三、运行 one-api 3.1 添加规则 3.2 运行 one-api 四、添加大模型 API 4.1 添加大模型 API 五、总结 本文通过 Flexus云服务器X实例 部署 one-api。Flexus云服务器X实例是新一代面向中小企业…...

2024 SNERT 预备队招新 CTF 体验赛-Web

目录 1、robots 2、NOF12 3、get_post 4、好事慢磨 5、uploads 6、rce 7、ezsql 8、RCE 1、robots robots 协议又叫爬虫协议&#xff0c;访问 robots.txt 继续访问 /JAY.php 拿到 flag&#xff1a;flag{hello_Do_YOU_KONw_JAY!} 2、NOF12 F12 和右键都被禁用 方法&#…...

亲测全网10大“免费”论文降重神器!论文写作必备!

在当今学术研究和论文写作中&#xff0c;AI技术的应用已经变得越来越普遍。为了帮助学者们更高效地完成论文撰写任务&#xff0c;以下将详细介绍十款必备的论文写作工具&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…...

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…...

Kafka 的基本概念

一、Kafka 主要用来做什么 作为消息系统&#xff1a;Kafka 具备系统解藕&#xff0c;流量削峰&#xff0c;缓冲&#xff0c;异步通信&#xff0c;扩展性&#xff0c;可恢复性等功能&#xff0c;以及消息顺序性保障和回溯消费 作为存储系统&#xff1a;Kafka 把消息持久化到磁…...

《粮油与饲料科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《粮油与饲料科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定 学术期刊。 问&#xff1a;《粮油与饲料科技》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;中文天地出版传媒集团股份有限公司…...

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如&#xff0c;它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…...

MoFA: 迈向AIOS

再一次向朋友们致以中秋的祝福&#xff01; MoFA (Modular Framework for Agents)是一个独特的模块化AI智能体框架。MoFA以组合&#xff08;Composition)的逻辑和编程&#xff08;Programmable&#xff09;的方法构建AI智能体。开发者通过模版的继承、编程、定制智能体&#xf…...

c语言中define使用方法

在C语言中&#xff0c;#define指令是预处理指令&#xff0c;用于定义宏。其常用格式是&#xff1a; 定义常量&#xff1a; #define 常量名 常量值 例子&#xff1a; #define PI 3.14159 #define MAX_SIZE 100 这里&#xff0c;PI和MAX_SIZE在代码中会被替换为其对应的值。没有…...

尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...