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

做网站 用 显示器百度推广可以自己开户吗

做网站 用 显示器,百度推广可以自己开户吗,多个wordpress站点同步,家在深圳坪山目录 1、ants介绍 2、使用方式汇总 3、各种使用方式详解 3.1 默认池 3.2 普通模式 3.3 带参函数 3.4 多池多协程 4、总结 1、ants介绍 众所周知,goroutine相比于线程来说,更加轻量、资源占用更少、无线程上下文切换等优势,但是也不能…

目录

1、ants介绍

2、使用方式汇总

3、各种使用方式详解

3.1 默认池

3.2 普通模式

3.3 带参函数

3.4 多池多协程

4、总结


1、ants介绍

      众所周知,goroutine相比于线程来说,更加轻量、资源占用更少、无线程上下文切换等优势,但是也不能无节制的创建使用,如果系统中开启的goroutine过多而没有及时回收,也会造成系统内存资源耗尽。

      ants是一款高性能的协程管理池,实现了协程的创建、缓存、复用、刷新、停止能功能,同时允许开发者设置线程池中worker的数量、线程池本身的个数以及workder中的任务,从而实现更加高效的运行效果。

github:GitHub - panjf2000/ants: 🐜🐜🐜 ants is a high-performance and low-cost goroutine pool in Go./ ants 是一个高性能且低损耗的 goroutine 池。

2、使用方式汇总

ants的使用有四种方式,分别如下:

这四种使用方式,前两种最常用,基本能满足日常系统的开发需要,第四种默认池,简单的场景也可以用,但不推荐,多池的情况还没想到特别合适的应用场景。

3、各种使用方式详解

3.1 默认池

ants在启动时,会默认初始化一个协程池,这部分代码位于ants.go文件中:

var (// ErrLackPoolFunc will be returned when invokers don't provide function for pool.ErrLackPoolFunc = errors.New("must provide function for pool")// ErrInvalidPoolExpiry will be returned when setting a negative number as the periodic duration to purge goroutines.ErrInvalidPoolExpiry = errors.New("invalid expiry for pool")// ErrPoolClosed will be returned when submitting task to a closed pool.ErrPoolClosed = errors.New("this pool has been closed")// ErrPoolOverload will be returned when the pool is full and no workers available.ErrPoolOverload = errors.New("too many goroutines blocked on submit or Nonblocking is set")// ErrInvalidPreAllocSize will be returned when trying to set up a negative capacity under PreAlloc mode.ErrInvalidPreAllocSize = errors.New("can not set up a negative capacity under PreAlloc mode")// ErrTimeout will be returned after the operations timed out.ErrTimeout = errors.New("operation timed out")// ErrInvalidPoolIndex will be returned when trying to retrieve a pool with an invalid index.ErrInvalidPoolIndex = errors.New("invalid pool index")// ErrInvalidLoadBalancingStrategy will be returned when trying to create a MultiPool with an invalid load-balancing strategy.ErrInvalidLoadBalancingStrategy = errors.New("invalid load-balancing strategy")// workerChanCap determines whether the channel of a worker should be a buffered channel// to get the best performance. Inspired by fasthttp at// https://github.com/valyala/fasthttp/blob/master/workerpool.go#L139workerChanCap = func() int {// Use blocking channel if GOMAXPROCS=1.// This switches context from sender to receiver immediately,// which results in higher performance (under go1.5 at least).if runtime.GOMAXPROCS(0) == 1 {return 0}// Use non-blocking workerChan if GOMAXPROCS>1,// since otherwise the sender might be dragged down if the receiver is CPU-bound.return 1}()// log.Lmsgprefix is not available in go1.13, just make an identical value for it.logLmsgprefix = 64defaultLogger = Logger(log.New(os.Stderr, "[ants]: ", log.LstdFlags|logLmsgprefix|log.Lmicroseconds))// Init an instance pool when importing ants.defaultAntsPool, _ = NewPool(DefaultAntsPoolSize)
)

使用起来就比较简单了,直接往池子里提交任务即可。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}
}
func main() {var wg sync.WaitGroupnow := time.Now()for i := 0; i < 5; i++ {wg.Add(1)ants.Submit(func() {add(10000000000)wg.Done()})}wg.Wait()fmt.Println(time.Since(now))now = time.Now()for i := 0; i < 5; i++ {add(10000000000)}fmt.Println(time.Since(now))
}

运行结果:

3.2 普通模式

普通模式和使用默认池非常类似,但是需要自己创建一个线程池:

p, _ := ants.NewPool(5)

函数参数为协程池协程个数,测试代码如下:

package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}
}
func main() {var wg sync.WaitGroupnow := time.Now()p, _ := ants.NewPool(5)for i := 0; i < 5; i++ {wg.Add(1)p.Submit(func() {add(10000000000)wg.Done()})}wg.Wait()fmt.Println("协程池运行:", time.Since(now))now = time.Now()for i := 0; i < 5; i++ {add(10000000000)}fmt.Println("循环运行:", time.Since(now))
}

3.3 带参函数

带参函数,重点是往worker中传递函数执行的参数,每个workder中都是同一个执行函数。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}fmt.Println("the sum is: ", sum)
}
func main() {var wg sync.WaitGroupnow := time.Now()p, _ := ants.NewPoolWithFunc(5, func(i interface{}) {add(i.(int))wg.Done()})for i := 0; i < 5; i++ {wg.Add(1)p.Invoke(1000000000)}wg.Wait()fmt.Println("循环运行:", time.Since(now))
}

运行结果:

liupeng@liupengdeMacBook-Pro ants_study % go run thread_default.go
the sum is:  499999999500000000
the sum is:  499999999500000000
the sum is:  499999999500000000
the sum is:  499999999500000000
the sum is:  499999999500000000
循环运行: 352.447333ms

3.4 多池多协程

这种模式,就是声明了多个协程池,每个池子里有多个协程在跑。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}fmt.Println("the sum is: ", sum)
}
func main() {var wg sync.WaitGrouprunTimes := 20now := time.Now()mpf, _ := ants.NewMultiPoolWithFunc(10, runTimes/10, func(i interface{}) {add(i.(int))wg.Done()}, ants.LeastTasks)for i := 0; i < runTimes; i++ {wg.Add(1)mpf.Invoke(1000000000)}wg.Wait()fmt.Println("循环运行:", time.Since(now))
}

运行记录:

4、总结

     以上就是ants协程池所有的使用方式,3.2、3.3章节介绍的两种方式比较常用,也是推荐的使用方式,使用协程池,可以有效的控制系统硬件资源的使用,防止机器被打满,对于高并发服务非常推荐使用。

      后面会学习一下ants的源码,并整理成文档发出来,欢迎围观。

http://www.mmbaike.com/news/90022.html

相关文章:

  • 沈阳网站建设 熊掌号浏览广告赚钱的平台
  • 外包公司做网站多少钱黑帽seo培训大神
  • wordpress 防采集插件高粱seo博客
  • 东莞疫情最新数据消息上海专业的seo公司
  • 网站会员注册怎么做seo的理解
  • 山东高端网站定制百度平台app下载
  • 营销型网站解决方案项目推广方案怎么写
  • 一套完整的app开发流程seo引擎优化培训
  • 哪家公司建换电站网店搜索引擎优化的方法
  • 梨树做网站人工智能培训课程
  • 成都小程序开发报价安卓优化大师手机版
  • 朝阳周边网站建设怎么seo网站排名
  • 鄂州网站推广优化技巧营销型网站建设的重要原则
  • 用dw做购票网站上海seo优化外包公司
  • 喀什地区建设局网站佛山百度推广电话
  • vps架设好网站访问不了seo专业推广
  • 个人网站心得个人能接广告联盟吗
  • 做同城网站需要哪些搭建网站工具
  • 北京云网站建设接单平台app
  • 怎么把网站做的好看青岛网页搜索排名提升
  • 灵犀科技 高端网站建设背景图网站推广广告
  • 中国空间站图片绘画武汉seo哪家好
  • 安徽水利建设市场信用信息平台网站公司软文怎么写
  • 做网站视频手机搜狗站长
  • 新疆生产建设兵团十二师公积金网站百度平台商家我的订单查询
  • 有没有专门做av字幕的网站泉州全网营销推广
  • 多种网站市场监督管理局投诉电话
  • 北京网站建设主页百度贴吧的互动社区
  • 可以做外链的图片网站子域名网址查询
  • 网站代更新活动营销推广方案