Go 并发控制利器 ants 使用文档

https://github.com/panjf2000/ants

在这里插入图片描述

1.1 什么是 ants

ants 是一个高性能的 Go 语言 goroutine 池,它能复用已完成任务的 goroutine,避免频繁创建和销毁 goroutine,节省 CPU 与内存开销,并且能限制并发数量防止资源被耗尽。

1.2 安装

go get -u github.com/panjf2000/ants/v2

1.3 最简单的例子

package mainimport ("fmt""time""github.com/panjf2000/ants/v2"
)func main() {// 创建一个容量为 10 的 goroutine 池pool, _ := ants.NewPool(10)defer pool.Release() // 程序结束释放资源// 提交任务for i := 0; i < 20; i++ {n := i_ = pool.Submit(func() {fmt.Printf("Task %d running\n", n)time.Sleep(time.Second)})}fmt.Println("All tasks submitted")time.Sleep(3 * time.Second) // 等待任务执行完
}

特点:

  • 同时最多只有 10 个任务运行。
  • 其余任务排队等待空闲 worker。

2. 进阶篇

2.1 核心 API

方法作用
ants.NewPool(size, options...)创建一个普通任务池
ants.NewPoolWithFunc(size, func, options...)创建一个绑定任务处理函数的池
Submit(task)提交任务到池
Invoke(param)提交参数,调用绑定函数
Running()当前正在运行的 worker 数量
Free()当前空闲 worker 数量
Cap()池容量
Tune(size)动态调整容量
Release()释放所有资源
Reboot()重启一个已释放的池

2.2 常用配置项

ants.WithPreAlloc(true)           // 预先分配内存,减少运行时分配
ants.WithNonblocking(true)        // worker 不够时立即返回错误,而不是等待
ants.WithMaxBlockingTasks(1000)   // 最大等待任务数
ants.WithPanicHandler(func(err interface{}) {fmt.Println("panic:", err)     // 捕获任务中的 panic
})
ants.WithExpiryDuration(time.Second * 10) // 空闲 worker 过期时间

2.3 PoolWithFunc 用法

package mainimport ("fmt""github.com/panjf2000/ants/v2""time"
)func main() {// 定义处理函数handler := func(data interface{}) {fmt.Printf("Processing: %v\n", data)time.Sleep(time.Millisecond * 500)}// 创建绑定函数的池pool, _ := ants.NewPoolWithFunc(5, handler)defer pool.Release()for i := 0; i < 10; i++ {_ = pool.Invoke(i) // 直接传参数}
}

3. 实战篇

3.1 批量任务执行

场景:你需要批量处理 10000 条数据,但不希望一次性开 10000 个 goroutine。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func processTask(id int) {fmt.Printf("Task %d start\n", id)time.Sleep(time.Second)fmt.Printf("Task %d done\n", id)
}func main() {var wg sync.WaitGrouppool, _ := ants.NewPool(50) // 控制并发为 50defer pool.Release()for i := 0; i < 10000; i++ {wg.Add(1)taskID := i_ = pool.Submit(func() {defer wg.Done()processTask(taskID)})}wg.Wait()
}

3.2 HTTP 并发控制

爬取多个 URL,但限制同时请求的数量。

package mainimport ("fmt""net/http""sync""github.com/panjf2000/ants/v2"
)func fetch(url string) {resp, err := http.Get(url)if err != nil {fmt.Println(err)return}defer resp.Body.Close()fmt.Println(url, resp.StatusCode)
}func main() {urls := []string{"https://golang.org","https://github.com","https://google.com",}var wg sync.WaitGrouppool, _ := ants.NewPool(5)defer pool.Release()for _, url := range urls {wg.Add(1)u := url_ = pool.Submit(func() {defer wg.Done()fetch(u)})}wg.Wait()
}

4. 最佳实践与注意事项

  1. 适合长时间运行的服务

    • 在任务密集的服务中能显著降低内存占用。
  2. 任务不宜过大或阻塞太久

    • 单个任务阻塞会占用 worker,影响吞吐量。
  3. panic 处理必须配置

    • 避免单个任务导致池崩溃。
  4. 选择合适的池大小

    • 一般为 CPU核数 * N,N 根据 IO 密集度调整。
  5. 性能对比

    • 对于少量任务,直接开 goroutine 可能更快;
    • 对于大规模并发,ants 会明显减少 GC 压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93120.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day57--图论--53. 寻宝(卡码网)

Day57–图论–53. 寻宝&#xff08;卡码网&#xff09; 今天学习&#xff1a;最小生成树。有两种算法&#xff08;Prim和Kruskal&#xff09;和一道例题。 prim 算法是维护节点的集合&#xff0c;而 Kruskal 是维护边的集合。 最小生成树&#xff1a;所有节点的最小连通子图&am…

解决海洋探测数据同步网络问题的新思路——基于智能组网技术的探索

随着海洋探测技术的不断发展&#xff0c;数据同步网络的稳定性和低延迟需求变得愈发重要。海洋探测数据来自多个分布式采集点&#xff0c;这些点需要高效的组网方式来实现实时数据传输。然而&#xff0c;由于海洋环境的特殊性&#xff08;如复杂的网络拓扑、高湿度和极端温度&a…

设计模式笔记_行为型_责任链模式

1. 责任链模式介绍责任链模式&#xff08;Chain of Responsibility&#xff09;是一种行为设计模式&#xff0c;它允许将多个处理器&#xff08;处理对象&#xff09;连接成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个处理器处理它为止。职责链模式的主要目…

pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?

一、pg.event.get() 返回的是一组事件 pg.event.get() 返回的是一组事件&#xff08;一个包含多个事件对象的列表&#xff09;。这是因为在游戏的“一帧”时间内&#xff08;通常1/60秒左右&#xff09;&#xff0c;用户可能会触发多个事件&#xff08;比如同时按下多个键、快速…

TF - IDF算法面试与工作常见问题全解析

在自然语言处理领域&#xff0c;TF - IDF算法是一个基础且重要的概念。无论是在求职面试还是在实际工作中&#xff0c;都经常会遇到与TF - IDF相关的问题。以下是一些常见的问题及其详细解答&#xff1a; 一、基本概念类问题 1. 什么是TF - IDF算法&#xff1f; TF - IDF&#…

Transformer网络结构解析

博主会经常分享自己在人工智能阶段的学习笔记&#xff0c;欢迎大家访问我滴个人博客&#xff01;&#xff08;都不白来&#xff01;&#xff09; 小牛壮士 - 个人博客https://kukudelin.top/ 前言 Transformer 广泛应用于自然语言处理&#xff08;如机器翻译、文本生成&…

gateway进行接口日志打印

打印需求&#xff1a;对所有的接口打印&#xff1a;请求方式&#xff0c;请求路径&#xff0c;请求参数&#xff0c;用户id&#xff0c;访问IP&#xff0c;访问时间对增删改操作的接口打印&#xff1a;接口响应打印方案&#xff1a;给GET设置一个白名单&#xff08;因为get请求…

MATLAB实现图像增强(直方图均衡化)

直方图均衡化是一种常用的图像增强技术&#xff0c;它通过重新分布图像的像素强度值来增强图像的对比度。以下是MATLAB中实现直方图均衡化的详细方法。%% 直方图均衡变换 clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;%% …

java15学习笔记-密封类

360:Sealed Classes (Preview) 封闭类&#xff08;预览&#xff09; 总结 使用密封类和接口增强Java编程语言。密封类和接口限制了哪些其他类或接口可以扩展或实现它们。这是JDK 15中的预览语言功能。 目标 允许类或接口的作者控制负责实现它的代码。 提供一种比访问…

西门子PLC通过稳联技术EtherCAT转Profinet网关连接baumuller伺服器的配置案例

西门子PLC用稳联技术的EtherCAT转Profinet网关&#xff0c;连上baumuller伺服器的配置例子本案例实现西门子S71200 PLC通过EtherCAT转Profinet网关对baumuller&#xff08;Baumller&#xff09;伺服器的实时控制&#xff0c;适用于高精度运动控制场景&#xff08;如精密机床、自…

Ansible 详细笔记

Ansible 详细笔记 一、Ansible 基础概述 1.1 定义与定位 Ansible 是由 Red Hat 主导开发的开源自动化运维工具&#xff0c;基于 Python 语言实现&#xff0c;专注于简化 IT 基础设施的配置管理、应用部署、任务编排等操作。它采用无代理架构&#xff0c;通过 SSH 协议与被控节点…

【Java 后端】Spring Boot 集成 JPA 全攻略

Spring Boot 集成 JPA 全攻略 一、前言 在 Java Web 开发中&#xff0c;数据库访问是绕不开的话题。 传统方式使用 JDBC 编写 SQL&#xff0c;维护困难、可读性差。后来有了 MyBatis 这种半自动 ORM 框架&#xff0c;再到 JPA&#xff08;Java Persistence API&#xff09;这…

pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)

写在前面&#xff1a;有些地方和视频里不一样的是因为官方文档更新了&#xff0c;一些参数用法不一样也很正常&#xff0c;包括我现在的也是我这个时间节点最新的&#xff0c;谁知道过段时间会不会更新呢 建议大家不要一味看视频/博客&#xff0c;多看看官方文档才是正道&#…

RocketMQ 4.9.3源码解读-NameServer组件启动流程分析

作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流 【金山文档 | WPS云文档】 namesrv 启动流程 相关重要类介绍说明…

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准

《嵌入式 C 语言编码规范与工程实践个人笔记》参考华为C语言规范标准 前言 在电子系统开发领域&#xff0c;C 语言作为底层开发的核心语言&#xff0c;其代码质量直接关系到系统的稳定性、可维护性和扩展性。良好的编码规范不仅是团队协作的基础&#xff0c;更是降低生命周期成…

纯半精度模型和全精度模型的耗时分别为248微秒和1400微秒。混合精度模型371微秒比原始模型快大约四倍!

不过有一点需要注意:在上下文管理器内部生成的任何输出,必然会采用该上下文管理器的数据类型。因此,之后我们必须将这些输出转换回FP32(例如,使用float()函数)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…

一款开源的远程桌面软件,旨在为用户提供流畅的游戏体验,支持 2K 分辨率、60 FPS,延迟仅为 40ms。

软件介绍 CloudPlayPlus&#xff08;云玩加&#xff09;是一款令人惊艳的开源远程桌面、串流软件&#xff0c;云玩加由个人开发者开发者&#xff0c;具有四大特征&#xff1a;开源、免费、低延迟、安全。 软件使用 客户端支持多个平台&#xff0c;包括 Windows、Mac OS、安卓…

MySql——binlog和redolog的区别

目录一、binlog和redolog的区别一、binlog和redolog的区别 binlog和redolog都是存储修改的新数据&#xff0c;是否保留binlog和redolog中的一个即可。 binlog属于整个mysql&#xff0c;是所有引擎共用的&#xff0c;不是只属于innoDB引擎。而redolog属于InnoDB存储引擎。binlo…

软件著作权产生与登记关键点

知识讲解一、 软件著作权的核心特征与权利内容自动产生原则&#xff1a; 这是软件著作权最核心、最重要的特征。产生时间&#xff1a; 软件著作权自软件开发完成之日起自动产生。法律依据&#xff1a; 《中华人民共和国著作权法》第二条及《计算机软件保护条例》第五条明确规定…

什么是主成分分析(PCA)和数据降维

主成分分析&#xff08;PCA&#xff09;和数据降维是机器学习和统计学中处理高维数据的核心工具。下面用清晰的结构解释其概念、原理和应用&#xff1a; 一、数据降维&#xff08;Dimensionality Reduction&#xff09; 1. 是什么&#xff1f; 目标&#xff1a;将高维数据&…