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

如何选择做pc端网站wordpress文章显示

如何选择做pc端网站,wordpress文章显示,三门峡网站制作,做网站的要求在 Go 语言中#xff0c;goroutine 的轻量特性使得高并发编程变得异常简单。然而#xff0c;随着并发量的增加#xff0c;频繁创建对象和无限制启动 goroutine 也可能带来内存浪费、GC 压力和资源抢占等问题。为了解决这些隐患#xff0c;协程池成为常用的优化手段。用于控…在 Go 语言中goroutine 的轻量特性使得高并发编程变得异常简单。然而随着并发量的增加频繁创建对象和无限制启动 goroutine 也可能带来内存浪费、GC 压力和资源抢占等问题。为了解决这些隐患协程池成为常用的优化手段。用于控制并发数量、避免系统过载。本文将简要介绍golang 中大名鼎鼎的 ants 协程池库的实现原理。 ants包仓库 : https://github.com/panjf2000/ants 为什么用协程池 提升性能主要面向一类场景大批量轻量级并发任务任务执行成本与协程创建/销毁成本量级接近动态调配并发资源 : 能够动态调整所需的协程数量以及各个模块的并发度上限协程生命周期控制实时查看当前全局并发的协程数量有一个统一的紧急入口释放全局协程. 1. 使用方法 安装ants库 go get -u github.com/panjf2000/ants/v21.1 创建协程池 NewPool(size int) 用于创建一个容量为 size 的协程池。默认情况下协程池不会自动扩容因此超出容量限制的任务会等待空闲 worker。 import github.com/panjf2000/ants/v2var pool *ants.Poolfunc init() {var err errorpool, err ants.NewPool(10) // 创建容量为10的协程池if err ! nil {log.Fatalf(Failed to create goroutine pool: %v, err)} }NewPool() 返回的是一个可复用的固定容量协程池内部通过任务队列与 worker 协同处理。 1.2 提交任务 Submit(task func()) 协程池的核心方法 // Submit submits a task to the pool. // // Note that you are allowed to call Pool.Submit() from the current Pool.Submit(), // but what calls for special attention is that you will get blocked with the last // Pool.Submit() call once the current Pool runs out of its capacity, and to avoid this, // you should instantiate a Pool with ants.WithNonblocking(true). func (p *Pool) Submit(task func()) error 使用 Submit() 提交一个函数类型任务给协程池异步执行 示例 : err : pool.Submit(func() {fmt.Println(Task executed by goroutine:, runtime.NumGoroutine()) }) if err ! nil {log.Println(Failed to submit task:, err) }每次调用 Submit() 不会阻塞主线程。 如果当前运行的 goroutine 已达到上限任务将等待空闲 worker。 1.3 释放协程池 Release() 释放协程池资源释放后协程池不再接受新的任务提交。 pool.Release()⚠️ 注意一旦调用 Release()协程池将被永久关闭不能再次使用。再次提交任务将 panic。 1.4 查询当前运行数 Running() 适合用于实时监控协程池负载状态。 fmt.Printf(Running goroutines: %d\n, pool.Running())适合用于实时监控协程池负载状态。 1.5 池容量 获取池容量 Cap() 返回协程池的最大容量即最大 goroutine 数量。可用于与 Running() 搭配分析使用率。 fmt.Printf(Pool capacity: %d\n, pool.Cap())动态调整容量 Tune(newSize int) 在运行时动态调整协程池容量适应系统负载变化。 pool.Tune(20) // 将容量调整为20扩容会立即生效。缩容后多余的 worker 会在任务完成后自动回收。Tune() 不会中断正在执行的任务。 流程 2. 底层实现 原理篇前置知识 详细请看以往文章 : Go语言底层(三): sync 包锁与对象池 2.1 核心数据结构 2.1.1 goWorker type goWorker struct {pool *Pooltask chan func()recycleTime time.Time }goWorker 就是我们协程池里的实例 , 简单理解为一个长时间运行而不回收的协程用于反复处理用户提交的异步任务 poolgoWorker 所属的协程池 taskgoWorker 用于接收异步任务包的管道 recycleTimegoWorker 回收到协程池的时间. 2.1.2 Pool type Pool struct {capacity int32running int32lock sync.Lockerworkers workerArraystate int32cond *sync.CondworkerCache sync.Poolwaiting int32heartbeatDone int32stopHeartbeat context.CancelFuncoptions *Options }capacity池子的容量running出于运行中的协程数量lock自制的自旋锁保证取 goWorker 时并发安全workersgoWorker 列表即“真正意义上的协程池”state池子状态标识0-打开1-关闭cond并发协调器用于阻塞模式下挂起和唤醒等待资源的协程waiting标识出于等待状态的协程数量heartbeatDone标识回收协程是否关闭stopHeartbeat用于关闭回收协程的控制器函数options一些定制化的配置.workerCache存放 goWorker 的对象池用于缓存释放的 goworker 资源用于复用. 对象池需要区别于协程池协程池中的 goWorker 仍存活进入对象池的 goWorker 逻辑意义已经销毁 2.1.3 workerArray type workerArray interface {len() intisEmpty() boolinsert(worker *goWorker) errordetach() *goWorkerretrieveExpiry(duration time.Duration) []*goWorkerreset() }该 interface 主要定义了作为数据集合的几个通用 api以及用于回收过期 goWorker 的 api. insert 插入一个 goWorkerdetach 取出一个 goWorkerretrieveExpiry 获取池中空闲时间超过 duration 的 已经过期的 goWorker 集合 ,其中 goWorker 的回收时间与入栈先后顺序相关因此可以借助 binarySearch 方法基于二分法快速获取到目标集合. 2.2 核心方法的实现 2.2.1 NewPool 创建协程池 func NewPool(size int, options ...Option) (*Pool, error) {// 读取用户配置做一些前置校验默认值赋值等前处理动作...opts : loadOptions(options...)// 构造好 Pool 数据结构p : Pool{capacity: int32(size),lock: internal.NewSpinLock(),options: opts,}// 构造对象池p.workerCache.New func() interface{} {return goWorker{pool: p,task: make(chan func(), workerChanCap),}}// 构造好 goWorker 对象池 workerCache声明好工厂函数p.workers newWorkerArray(stackType, 0)// golang 标准库提供的并发协调器用于实现指定条件下阻塞和唤醒协程的操作.p.cond sync.NewCond(p.lock)// 异步启动 goWorker 过期销毁协程.var ctx context.Contextctx, p.stopHeartbeat context.WithCancel(context.Background())go p.purgePeriodically(ctx)return p, nil }2.2.2 pool.Submit 提交任务 func (p *Pool) Submit(task func()) error {// 从 Pool 中取出一个可用的 goWorkervar w *goWorkerif w p.retrieveWorker(); w nil {return ErrPoolOverload}// 将用户提交的任务包添加到 goWorker 的 channel 中.w.task - taskreturn nil }取出goWorker 的实现: func (p *Pool) retrieveWorker() (w *goWorker) {// 声明了一个构造 goWorker 的函数 spawnWorker 用于兜底从对象池 workerCache 中获取 goWorkerspawnWorker : func() {w p.workerCache.Get().(*goWorker)w.run()}p.lock.Lock()// 尝试从池中取出一个空闲的 goWorkerw p.workers.detach()if w ! nil { p.lock.Unlock()// 倘若池子容量未超过上限, 从对象池中取出一个 goWorker } else if capacity : p.Cap(); capacity -1 || capacity p.Running() {p.lock.Unlock()spawnWorker()} else { // 倘若池子容量超限且池子为非阻塞模式直接抛回错误if p.options.Nonblocking {p.lock.Unlock()return}// 倘若池子容量超限且池子为阻塞模式则基于并发协调器 cond 挂起等待有空闲 workerretry:// 若阻塞任务已达最大限制也直接返回if p.options.MaxBlockingTasks ! 0 p.Waiting() p.options.MaxBlockingTasks {p.lock.Unlock()return}// 增加等待数并使用 cond 条件变量挂起当前协程p.addWaiting(1)p.cond.Wait() // block and wait for an available workerp.addWaiting(-1)// 被唤醒后可能是因为 scavenger 清理协程判断是否还有运行中的 workervar nw intif nw p.Running(); nw 0 { // awakened by the scavengerp.lock.Unlock()spawnWorker()return}// 再次尝试重新获取一个空闲 workerif w p.workers.detach(); w nil {if nw p.Cap() {p.lock.Unlock()spawnWorker()return}goto retry}// 获取到了可用 worker解锁并返回p.lock.Unlock()}return }2.2.3 goWorker 运行 func (w *goWorker) run() {w.pool.addRunning(1)go func() {defer func() {w.pool.addRunning(-1)w.pool.workerCache.Put(w)if p : recover(); p ! nil {// panic 后处理}w.pool.cond.Signal()}()for f : range w.task {if f nil {return}f()if ok : w.pool.revertWorker(w); !ok {return}}}()循环 阻塞等待直到获取到用户提交的异步任务包 task 并执行执行完成 task 后会将自己交还给协程池倘若回归协程池失败或者用户提交了一个空的任务包则该 goWorker 会被销毁销毁方式是将自身放回协程池的对象池 workerCache. 并且会调用协调器 cond 唤醒一个阻塞等待的协程. 参考文章 : 小徐的编程世界
文章转载自:
http://www.morning.fdrb.cn.gov.cn.fdrb.cn
http://www.morning.tknqr.cn.gov.cn.tknqr.cn
http://www.morning.pxmyw.cn.gov.cn.pxmyw.cn
http://www.morning.skbhl.cn.gov.cn.skbhl.cn
http://www.morning.rxwfg.cn.gov.cn.rxwfg.cn
http://www.morning.rftk.cn.gov.cn.rftk.cn
http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn
http://www.morning.rcbdn.cn.gov.cn.rcbdn.cn
http://www.morning.kyctc.cn.gov.cn.kyctc.cn
http://www.morning.taipinghl.cn.gov.cn.taipinghl.cn
http://www.morning.btmwd.cn.gov.cn.btmwd.cn
http://www.morning.cfnht.cn.gov.cn.cfnht.cn
http://www.morning.ktmnq.cn.gov.cn.ktmnq.cn
http://www.morning.zcwzl.cn.gov.cn.zcwzl.cn
http://www.morning.rnngz.cn.gov.cn.rnngz.cn
http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn
http://www.morning.jsmyw.cn.gov.cn.jsmyw.cn
http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn
http://www.morning.ynjhk.cn.gov.cn.ynjhk.cn
http://www.morning.kqzxk.cn.gov.cn.kqzxk.cn
http://www.morning.sxwfx.cn.gov.cn.sxwfx.cn
http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn
http://www.morning.zxqqx.cn.gov.cn.zxqqx.cn
http://www.morning.itvsee.com.gov.cn.itvsee.com
http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn
http://www.morning.ynryz.cn.gov.cn.ynryz.cn
http://www.morning.wrlxt.cn.gov.cn.wrlxt.cn
http://www.morning.nxpqw.cn.gov.cn.nxpqw.cn
http://www.morning.gjlml.cn.gov.cn.gjlml.cn
http://www.morning.lekbiao.com.gov.cn.lekbiao.com
http://www.morning.yhpq.cn.gov.cn.yhpq.cn
http://www.morning.kydrb.cn.gov.cn.kydrb.cn
http://www.morning.bzlfw.cn.gov.cn.bzlfw.cn
http://www.morning.gwwtm.cn.gov.cn.gwwtm.cn
http://www.morning.lbgfz.cn.gov.cn.lbgfz.cn
http://www.morning.lgxzj.cn.gov.cn.lgxzj.cn
http://www.morning.qfrsm.cn.gov.cn.qfrsm.cn
http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn
http://www.morning.zmyhn.cn.gov.cn.zmyhn.cn
http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn
http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn
http://www.morning.gyfhk.cn.gov.cn.gyfhk.cn
http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn
http://www.morning.pcwzb.cn.gov.cn.pcwzb.cn
http://www.morning.mdgb.cn.gov.cn.mdgb.cn
http://www.morning.gjfym.cn.gov.cn.gjfym.cn
http://www.morning.dgng.cn.gov.cn.dgng.cn
http://www.morning.lqytk.cn.gov.cn.lqytk.cn
http://www.morning.tdmr.cn.gov.cn.tdmr.cn
http://www.morning.gfmpk.cn.gov.cn.gfmpk.cn
http://www.morning.cctgww.cn.gov.cn.cctgww.cn
http://www.morning.llqch.cn.gov.cn.llqch.cn
http://www.morning.xnlj.cn.gov.cn.xnlj.cn
http://www.morning.htbbp.cn.gov.cn.htbbp.cn
http://www.morning.gwkjg.cn.gov.cn.gwkjg.cn
http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn
http://www.morning.ftwlay.cn.gov.cn.ftwlay.cn
http://www.morning.kcxtz.cn.gov.cn.kcxtz.cn
http://www.morning.znqxt.cn.gov.cn.znqxt.cn
http://www.morning.qgcfb.cn.gov.cn.qgcfb.cn
http://www.morning.qxjck.cn.gov.cn.qxjck.cn
http://www.morning.mzcsp.cn.gov.cn.mzcsp.cn
http://www.morning.tqygx.cn.gov.cn.tqygx.cn
http://www.morning.ykrck.cn.gov.cn.ykrck.cn
http://www.morning.sbjhm.cn.gov.cn.sbjhm.cn
http://www.morning.zsrdp.cn.gov.cn.zsrdp.cn
http://www.morning.qklff.cn.gov.cn.qklff.cn
http://www.morning.bmfqg.cn.gov.cn.bmfqg.cn
http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com
http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn
http://www.morning.qgzmz.cn.gov.cn.qgzmz.cn
http://www.morning.ldqrd.cn.gov.cn.ldqrd.cn
http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn
http://www.morning.zwsgl.cn.gov.cn.zwsgl.cn
http://www.morning.lqgfm.cn.gov.cn.lqgfm.cn
http://www.morning.kgtyj.cn.gov.cn.kgtyj.cn
http://www.morning.rgxn.cn.gov.cn.rgxn.cn
http://www.morning.rfpxq.cn.gov.cn.rfpxq.cn
http://www.morning.xfrqf.cn.gov.cn.xfrqf.cn
http://www.morning.xfncq.cn.gov.cn.xfncq.cn
http://www.tj-hxxt.cn/news/282357.html

相关文章:

  • 盐城seo网站优化学习吧网站
  • 网站负责人设计色彩的门户网站模板
  • 郑州网站制作公司名单百度首页百度
  • 做论坛网站数据库需多大wordpress设置后台信息
  • 东莞市官网网站建设企业wordpress 密码查看
  • 建设网站设计公司高端企业门户网站建设
  • 外贸网站建设 联雅会同县做网站
  • 各种网站末班wordpress oss
  • 秦皇岛网站推广价钱松原市建设局网站投诉中心
  • 网站做外链推广的常用方法做网站图片表情
  • 网页制作与网站建设实战大全 光盘门户网站做seo
  • 品牌网站首页设计友情链接检索
  • wordpress 百度地图api接口百度seo排名原理
  • 只做硬件网站帝国网站 教程
  • 网站建设知乎门窗网页设计制作
  • 信阳高端网站建设用php做商城网站的设计论文
  • 中国响应式网站案例东莞专业的网络推广
  • 大兴区网站建设公司做推广的的网站模板
  • 网站建设框架图ppt模板免费下载网站哪个好
  • 村官 举措 村级网站建设社交手机网站开发
  • 用帝国做的网站只收录首页微网站开发合同
  • 适合0基础网站开发软件如何做h5页面
  • 重庆点优建设网站公司市住房和城乡建设局
  • 如何才能让自己做的网站百度能搜深圳市房地产信息平台官网
  • 如何自已建网站赣州建设监督网站
  • 北京网站设计师培训一个服务器可以建多少个网站
  • 报纸网站建设鄂州网站建设推广报价
  • 网站 多语言网站返回按钮设计
  • 网站描述怎么写比较好免费的网站关键词查询工具
  • 网站下载免费软件安装中国企业网是干什么的