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

武夷山网站建设wzjseo深圳住房和建设局网站无法登陆

武夷山网站建设wzjseo,深圳住房和建设局网站无法登陆,WordPress添加进度条,电子商务网站系统规划报告什么是singleflight singleflight是一种并发编程设计模式#xff0c;将同一时刻的多个并发请求合并成一个请求#xff0c;以减少对下游服务的压力 为什么叫singleflight fly可以理解为请求数#xff0c;singleflight就是单个请求 使用场景 该模式主要用于防止缓存击穿 …什么是singleflight singleflight是一种并发编程设计模式将同一时刻的多个并发请求合并成一个请求以减少对下游服务的压力 为什么叫singleflight fly可以理解为请求数singleflight就是单个请求 使用场景 该模式主要用于防止缓存击穿 例如当本地缓存失效时为了防止大量请求都打到远程缓存redis可以用singleflight保证该时刻只会有一个请求发到远程缓存 或者当远程缓存失效时为了防止大量请求都打到db可以用singleflight保证该时刻只有一个请求发往db查询数据 本文将比较go-zero和官方库对singleflight的实现 Go-zero 代码地址https://github.com/zeromicro/go-zero/blob/master/core/syncx/singleflight.go go-zero中对singleflight的定义如下 type (SingleFlight interface {Do(key string, fn func() (any, error)) (any, error)DoEx(key string, fn func() (any, error)) (any, bool, error)}call struct {wg sync.WaitGroupval anyerr error}flightGroup struct {calls map[string]*calllock sync.Mutex} )SingleFlight接口定义调Do或DoEx用单并发的方式对资源发起请求 参数key资源的标识参数fn真正请求获取资源的方法DoEx的第二个返回值bool 表示从共享获取的还是发起真实请求获取的 call表示同一时刻对一个资源的一组请求 wg这一组的goroutine都阻塞在该wg上valerr请求的返回值err flightGroup总控结构 calls维护了正在执行中的call 我们看Do做了啥 func (g *flightGroup) Do(key string, fn func() (any, error)) (any, error) {c, done : g.createCall(key)if done {return c.val, c.err}g.makeCall(c, key, fn)return c.val, c.err }首先调g.createCall(key)创建call 如果此时已经有其他协程发起了对call的请求当前协程就阻塞住等待拿到结果后直接返回 如果done为false表示当前协程是第一个发起 call 的协程那执行g.makeCall(c, key, fn)发起真正的call请求 createCall实现如下 func (g *flightGroup) createCall(key string) (c *call, done bool) {g.lock.Lock()if c, ok : g.calls[key]; ok {g.lock.Unlock()c.wg.Wait()return c, true}c new(call)c.wg.Add(1)g.calls[key] cg.lock.Unlock()return c, false }其实就干了一件事判断是不是第一个对key的调用 不是阻塞在c.wa上是创建call 接下来看makeCall func (g *flightGroup) makeCall(c *call, key string, fn func() (any, error)) {defer func() {g.lock.Lock()delete(g.calls, key)g.lock.Unlock()c.wg.Done()}()c.val, c.err fn() }真正执行fn方法执行完毕后 将key从calls中删除这样下一组并发请求到来时会重新发起真正的请求获取新值调用wg.done()这样之前阻塞在wg的协程都会获得结果并返回 官方库 接下来看看go官方库对singleflight的实现 代码地址https://cs.opensource.google/go/x/sync//036812b2:singleflight/singleflight.go 除了也实现了go-zero的Do方法外官方库另外提供了DoChan的模式 无论是第一个还是非第一个协程都不阻塞在DoChan的调用中而是返回一个channel可以当需要读数据时才从channel中获取也就是说将是否阻塞获取调用结果的权力交给调用方 看看详细过程DoChan func (g *Group) DoChan(key string, fn func() (interface{}, error)) -chan Result {ch : make(chan Result, 1)g.mu.Lock()if g.m nil {g.m make(map[string]*call)}if c, ok : g.m[key]; ok {c.dupsc.chans append(c.chans, ch)g.mu.Unlock()// 返回channelreturn ch}c : call{chans: []chan- Result{ch}}c.wg.Add(1)g.m[key] cg.mu.Unlock()// 异步发起调用go g.doCall(c, key, fn)// 非阻塞的返回channelreturn ch }那什么时候往channel塞数据呢在doCall调用成功后将返回值挨个发送到等待的channel中 for _, ch : range c.chans {ch - Result{c.val, c.err, c.dups 0} }
http://www.tj-hxxt.cn/news/225409.html

相关文章:

  • 怎么让客户做网站优化一个空间可以做几个网站吗
  • 网站上展示手机页面是怎么做的山西国人伟业网站
  • 徐州市丰县建设局网站flash网站模版
  • 北京做网站建设的公司哪家好报纸门户网站建设方案
  • 找人做网站上线后被投诉侵权互联网营销师培训学校
  • 武隆网站建设费用网上购物商城有哪些
  • 视频网站建设框架学校网页网站模板
  • 怎样在百度免费做网站抖音关键词查询工具
  • 国外好看的网站设计个人网站 建设
  • 融资融券配资网站建设wordpresS追踪访问轨迹
  • 盐城营销型网站网站区域名怎么注册
  • 怎么做二级域名网站新手如何做淘宝运营
  • 网站建设佛山拓客科技公司个人做百度云下载网站
  • 网站维护的要求包括哪些ppt模板简约 淡雅 大气
  • 网站seo啥意思怎么在百度免费推广
  • 网站建设管理维护制度p2p提供网站建设违法
  • 福鼎市城市建设监察大队网站苍南县规划建设局网站
  • 企业是做网站还是做微信室内设计师常用网站
  • 长垣县建站塔山双喜做网站容易吧
  • 德州企业网站建设要素网站如何做的有特色
  • 微网站模板代码电子商务网站会员体系
  • 网站营销最大的特点河南省重点项目建设网站
  • 久久建筑网站下载菏泽外贸网站建设公司
  • 太湖网站建设推荐秒搜科技秦皇岛抖音推广公司
  • 长春长春网站建设网WordPress建站详细过程
  • 备案查询站长工具青岛艺腾网站建设
  • 怎么做网站中英文版本百度搜索图片
  • 建站专家京网站建设
  • 从零开始学做网站cdsn海口网站建设咨询
  • 网站平台设计费用超市库存管理软件