使用ants并发任务,事半功倍

简介: 使用ants并发任务,事半功倍

使用ants并发,事半功倍



简介


ants是一个高性能的goroutine池,实现了对大规模goroutine的调度管理、goroutine复用,允许使用者在开发并发程序的时候限制goroutine数量,复用资源,达到更高效执行任务的效果。


功能


  • 自动调度海量的goroutines,复用goroutines
  • 定期清理过期的goroutines,进一步节省资源
  • 提供了大量有用的接口:任务提交、获取运行中的goroutine数量、动态调整Pool大小、释放Pool、重启Pool
  • 优雅处理panic,防止程序崩溃
  • 资源复用,极大节省内存使用量;在大规模批量并发任务场景下比原生goroutine并发具有更高的性能
  • 非阻塞机制


如何运行


流程图:

640.png


示意图:

640.png


刚开始Goroutine Pool中有四个Worker,然后当前有六个Task任务。

然后程序运行起来之后,每个Worker绑定一个Task开始工作,剩余两个Task在等待被调度。

只要Worker有空闲的就会Fetch一个Task开始Running

所有的Task执行完成之后,Worker有收回进Goroutine Pool中。


安装


  • 使用ants v1版本:

go get -u github.com/panjf2000/ants

  • 使用ants v2版本 (开启 GO111MODULE=on):

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


使用


go 发程序的时候如果程序会启动大量的goroutine,势必会消耗大量的系统资源(内存,CPU),通过使用ants,可以实例化一个goroutine池,复用goroutine,节省资源,提升性能。


  1. 初始化一个Pool
package pool
import (
 "github.com/panjf2000/ants"
 "sync"
)
var (
 pool *ants.Pool
 once sync.Once
)
func InitPool(size int) {
 once.Do(func() {
  var err error
  pool, err = ants.NewPool(size)
  if err != nil {
   panic(err)
  }
 })
}
func GetPool() *ants.Pool {
 return pool
}


然后在main.go中使用:


func main() {
     // 初始化goroutine池
     pool.InitPool(100)
     pool.GetPool().Submit(func() {
            fmt.Println("task1")
        })
      pool.GetPool().Submit(func() {
            fmt.Println("task2")
        })
      pool.GetPool().Submit(func() {
            fmt.Println("task3")
        })
       pool.GetPool().Submit(func() {
            fmt.Println("task4")
        })
      select{}
}


额外说明


  1. Pool创建之后,程序退出的时候得释放pool.Release()
  2. 也可以重启Poolpool.Reboot()// 只要调用 Reboot() 方法,就可以重新激活一个之前已经被销毁掉的池,并且投入使用。
  3. Pool有自己的一些配置,比如PreAlloc预分配,Logger以及Nonblocking等,详细请参考官网:https://github.com/panjf2000/ants/blob/dev/README_ZH.md
相关文章
|
1月前
|
Python
解锁Python并发新世界:线程与进程的并行艺术,让你的应用性能翻倍!
【7月更文挑战第9天】并发编程**是同时执行多个任务的技术,提升程序效率。Python的**threading**模块支持多线程,适合IO密集型任务,但受GIL限制。**multiprocessing**模块允许多进程并行,绕过GIL,适用于CPU密集型任务。例如,计算平方和,多线程版本使用`threading`分割工作并同步结果;多进程版本利用`multiprocessing.Pool`分块计算再合并。正确选择能优化应用性能。
22 1
|
1月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
39 3
|
1月前
|
大数据 API 数据处理
Python高手都在用的并发秘籍:解锁线程与进程的终极奥义,性能飙升不是梦!
【7月更文挑战第8天】Python并发编程提升性能,线程(threading)适合I/O密集型任务,如网络请求,通过`start()`和`join()`实现并发。进程(multiprocessing)利用多核CPU,适用于CPU密集型任务,如大数据处理。结合两者可优化混合任务,实现最佳并发效果。
25 1
|
3月前
|
数据采集 存储 C++
单线程 vs 多进程:Python网络爬虫效率对比
本文探讨了Python网络爬虫中的单线程与多进程应用。单线程爬虫实现简单,但处理速度慢,无法充分利用多核CPU。而多进程爬虫通过并行处理提高效率,更适合现代多核架构。代码示例展示了如何使用代理IP实现单线程和多进程爬虫,显示了多进程在效率上的优势。实际使用时还需考虑代理稳定性和反爬策略。
单线程 vs 多进程:Python网络爬虫效率对比
|
3月前
|
安全 Java 开发者
Python多线程编程实战:提高程序执行效率的策略
Python多线程编程实战:提高程序执行效率的策略
165 1
|
9月前
|
关系型数据库 MySQL 程序员
程序员性能之道,从使用perf开始!
程序员性能之道,从使用perf开始!
|
安全 Java Spring
并发编程-01并发初窥
并发编程-01并发初窥
77 0
|
算法 Java Linux
工作这么久了,还不懂多线程吗?
浩哥Java多线程整理学习系列之01基础知识整理
93 0
工作这么久了,还不懂多线程吗?
|
缓存 Java 编译器
并发编程笔记1:并发bug的成因
并发编程笔记1:并发bug的成因