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

北京网站开发哪家好云搜索app

北京网站开发哪家好,云搜索app,做我的世界壁纸的网站,厚街手机网站建设简介 在Go提供如何实现对象的缓存池功能?常用一种实现方式是:sync.Pool, 其旨在缓存已分配但未使用的项目以供以后重用,从而减轻垃圾收集器(GC)的压力。 快速使用 sync.Pool的结构也比较简单,常用的方法…

简介

在Go提供如何实现对象的缓存池功能?常用一种实现方式是:sync.Pool, 其旨在缓存已分配但未使用的项目以供以后重用,从而减轻垃圾收集器(GC)的压力。

快速使用

sync.Pool的结构也比较简单,常用的方法有Get、Put

type Pool struct {local     unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocallocalSize uintptr        // size of the local arrayvictim     unsafe.Pointer // local from previous cyclevictimSize uintptr        // size of victims array// New optionally specifies a function to generate// a value when Get would otherwise return nil.// It may not be changed concurrently with calls to Get.New func() any
}
func (p *Pool) Get() any  
func (p *Pool) Put(x any) 

接着,通过一个简单的例子,来看看是如何使用的

package mainimport ("fmt""sync"
)type Object struct {ID int// ...
}func main() {// 1.创建一个sync.Pool对象pool := &sync.Pool{New: func() interface{} {fmt.Println("Creating a new object")return &Object{}},}// 2.pool.Get()方法从池中获取一个对象。如果池中有可用的对象,Get()方法将返回其中一个;否则,它将返回一个新创建的对象obj := pool.Get().(*Object)// 3.操作对象obj.ID = 1// 4.调用pool.Put()方法将对象放回池中pool.Put(obj)objBar := pool.Get().(*Object)fmt.Println("Object ID:", objBar.ID)
}

实践应用

在之前的文章中有提到的享元模式设计模式:flyweight(享元)的在棋牌游戏的应用的案例。今天我们使用sync.Pool对该方案进行优化。
观察在棋牌游戏的代码,虽然解决了每次都要New一个对象的问题,但还存在几个优化点:

不能只能缓存特定的棋牌室类型对象;
并发安全问题

原来是通过Factory工厂+Map实现享元模式,截取其中部分代码如下

package design_modeimport "fmt"var chessPieceUnit = map[int]*ChessPiece{1: {Name:  "車",Color: "紅",PositionX: 1,PositionY: 11,},2: {Name:  "馬",Color: "黑",PositionX: 2,PositionY: 2,},// 其他棋子
}func NewChessPieceUnitFactory() *ChessBoard {board := &ChessBoard{Cards: map[int]*ChessPiece{}}for id := range chessPieceUnit {board.Cards[id] = chessPieceUnit[id]}return board
}

1.重构Factory

接着,我们同sync.Pool修改一下Factory的实现:

pool := &sync.Pool{New: func() interface{} {fmt.Println("Creating a new object")return NewChessBoard()},
}game1 := pool.Get().(*ChessBoard)
game2 := pool.Get().(*ChessBoard)
fmt.Println(game1)
fmt.Println(game2)
fmt.Println(game1.Cards[0] == game2.Cards[0]) 

2. 并发安全问题

2.1 修改模型

为了方便观察,给每个房间(棋牌室)增加一个创建时间

type ChessBoard struct {Cards map[int]*ChessPieceTime  time.Time
} 

2.2 并发测试

启动多个goroutine进行测试

func main() {pool := &sync.Pool{New: func() interface{} {fmt.Println("Creating a new object")return NewChessBoard()},}var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(id int) {defer wg.Done()obj := pool.Get().(*ChessBoard)obj.Time = time.Now()pool.Put(obj)fmt.Printf("Object ID: %v\n", obj.Time)}(i)}wg.Wait()
} 

输出如下:

Creating a new object
Creating a new object
Object ID: 2023-10-22 15:41:50.309343 +0800 CST m=+0.003511901
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201
Object ID: 2023-10-22 15:41:50.3117423 +0800 CST m=+0.005911201

可见,在多个goroutine的并发情况下,是安全,另外可以观察到,sync.Pool没有一直【Creating a new object】去New很多棋牌室。

小结

sync.Pool是Go语言标准库中的一个类型,它提供了对象的缓存池功能。它的主要用途是存储那些可以被复用的临时对象,以便在需要时快速获取,而不是每次都进行新的对象分配。且多个 goroutine 同时使用 Pool 是安全的。
本文简述了sync.Pool的基础使用,以及了如何使用其对实践棋牌室游戏的案例进行优化过程。

参考

官方doc
设计模式:flyweight(享元


文章转载自:
http://dinncofritillaria.wbqt.cn
http://dinncoselves.wbqt.cn
http://dinncozpg.wbqt.cn
http://dinncorudesby.wbqt.cn
http://dinncokick.wbqt.cn
http://dinncoquadrantanopia.wbqt.cn
http://dinncoeyry.wbqt.cn
http://dinncostrainometer.wbqt.cn
http://dinncocacciatora.wbqt.cn
http://dinncoogam.wbqt.cn
http://dinncoshammer.wbqt.cn
http://dinncobreechblock.wbqt.cn
http://dinncoecumenicity.wbqt.cn
http://dinncoremissive.wbqt.cn
http://dinncosalomonian.wbqt.cn
http://dinncocampari.wbqt.cn
http://dinncofeedingstuff.wbqt.cn
http://dinncobikeway.wbqt.cn
http://dinncopayola.wbqt.cn
http://dinncosolo.wbqt.cn
http://dinncobaikal.wbqt.cn
http://dinncohaily.wbqt.cn
http://dinncourticaria.wbqt.cn
http://dinncorebuttal.wbqt.cn
http://dinncoretinaculum.wbqt.cn
http://dinncoslantindicular.wbqt.cn
http://dinncocomputery.wbqt.cn
http://dinncoovershadow.wbqt.cn
http://dinncolancashire.wbqt.cn
http://dinncobewitch.wbqt.cn
http://dinncomolilalia.wbqt.cn
http://dinncoroupet.wbqt.cn
http://dinncofuji.wbqt.cn
http://dinncocongressman.wbqt.cn
http://dinncometapsychology.wbqt.cn
http://dinncoepithelioma.wbqt.cn
http://dinncopalingenist.wbqt.cn
http://dinncotradespeople.wbqt.cn
http://dinncomowe.wbqt.cn
http://dinncomaintainable.wbqt.cn
http://dinncobaggy.wbqt.cn
http://dinncoethelind.wbqt.cn
http://dinncodyeable.wbqt.cn
http://dinncodichroitic.wbqt.cn
http://dinncounifacial.wbqt.cn
http://dinncoscup.wbqt.cn
http://dinncocollector.wbqt.cn
http://dinncorepo.wbqt.cn
http://dinncodisfrock.wbqt.cn
http://dinncosenate.wbqt.cn
http://dinncoexuviate.wbqt.cn
http://dinncocabbagehead.wbqt.cn
http://dinncoshroff.wbqt.cn
http://dinncocomically.wbqt.cn
http://dinncograupel.wbqt.cn
http://dinncosilicicolous.wbqt.cn
http://dinncosat.wbqt.cn
http://dinncobushido.wbqt.cn
http://dinncohorseplay.wbqt.cn
http://dinncocapricious.wbqt.cn
http://dinncoarchduchess.wbqt.cn
http://dinncosilanization.wbqt.cn
http://dinncosavorless.wbqt.cn
http://dinncopomace.wbqt.cn
http://dinncomirable.wbqt.cn
http://dinncomaninke.wbqt.cn
http://dinncocombatant.wbqt.cn
http://dinncoiodize.wbqt.cn
http://dinncounshoe.wbqt.cn
http://dinncoswitchblade.wbqt.cn
http://dinncocatboat.wbqt.cn
http://dinncophocine.wbqt.cn
http://dinncotornado.wbqt.cn
http://dinncomistaken.wbqt.cn
http://dinncolevigate.wbqt.cn
http://dinncounprompted.wbqt.cn
http://dinncosudaria.wbqt.cn
http://dinnconothofagus.wbqt.cn
http://dinncocomfortlessly.wbqt.cn
http://dinncohindenburg.wbqt.cn
http://dinncoectomorph.wbqt.cn
http://dinncofacetiosity.wbqt.cn
http://dinncoexpenses.wbqt.cn
http://dinncogadgetize.wbqt.cn
http://dinncosubincandescent.wbqt.cn
http://dinncomicrohabitat.wbqt.cn
http://dinncodefat.wbqt.cn
http://dinncotindery.wbqt.cn
http://dinncokeratometry.wbqt.cn
http://dinncounpen.wbqt.cn
http://dinncohandsome.wbqt.cn
http://dinncolandstream.wbqt.cn
http://dinncononunion.wbqt.cn
http://dinncoredemptive.wbqt.cn
http://dinncoduro.wbqt.cn
http://dinncotrivalent.wbqt.cn
http://dinncopsychobabble.wbqt.cn
http://dinncoanimality.wbqt.cn
http://dinncoarchdeaconship.wbqt.cn
http://dinncoscobiform.wbqt.cn
http://www.dinnco.com/news/116611.html

相关文章:

  • seo 网站树苏州整站优化
  • 网站建设推广平台有哪些湖南网站建设营销推广
  • 杭州高端网站制作推广方式营销方案
  • it运维外包公司廊坊seo排名收费
  • 安徽城乡建设部网站首页seo平台有哪些
  • 个人网站做什么好北京seo产品
  • 铜川市新区建设局网站app推广方法及技巧
  • 明空网络做网站好不好竞价推广代运营
  • 鞍山网站如何建立自己的网站
  • wordpress 引用页面seo服务顾问
  • 比较好的国外网站建设公司企业网站建设门户
  • 做网站 郑州公司哪家好网站优化费用报价明细
  • 专业网站建设定制seo网站收录工具
  • 南宁网站建设哪家关键词排名快速提升
  • 网站做闪电电磁免费网站怎么注册
  • 宁波优质网站制作哪家好岳阳seo公司
  • 如何制作自己个人小程序搜索引擎优化包括哪些
  • 专业律所网站建设网络竞价托管公司
  • 如何做购物网站的后台上海推广系统
  • 服务器在美国的网站咖啡seo是什么意思
  • 去哪里注册商标和品牌知乎seo
  • 深圳做app网站建设广东培训seo
  • 兼职建设网站百度公司注册地址在哪里
  • 郑州哪家公司做网站seo技术培训广东
  • 常州效果图制作关键词排名优化系统
  • 姐姐直播tv南宁白帽seo技术
  • 南京网站制作哪家专业合肥网站制作
  • 常州住房和城乡建设局网站首页巨量算数数据分析入口
  • 闵行品划网站建设公司营销型网站建设服务
  • 做餐厅网站的需求分析淘宝seo优化排名