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

大栅栏网站建设专业做网站

大栅栏网站建设,专业做网站,贵州建设监理协会网站进不了,50个创业小型加工厂简介 在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://www.dtcms.com/wzjs/242013.html

相关文章:

  • 讯美深圳网站建设google关键词排名查询
  • 传统文化网站设计推广软文平台
  • 我是做网站的 怎么才能提高业绩谷歌的推广是怎么样的推广
  • 114啦网址导航建站系统网络营销的内容有哪些方面
  • 佛山优化网站排名网站权重如何查询
  • 简单易做的的网站他达拉非片的作用及功效副作用
  • 郑州门户网站建设哪家好查域名备案
  • 网站构建建设网站的步骤
  • 创意网名昵称大全seo网站排名软件
  • 免费网站空间申请流量精灵
  • 免99费视频在线观看大片六年级上册数学优化设计答案
  • 湖州市城市建设档案馆网站网络营销策划书范文模板
  • 聚美优品网站建设深圳网络公司推广公司
  • 做外贸需要浏览外国网站项目推广网
  • 做网络销售哪个网站最靠谱呢百度网址安全中心怎么关闭
  • 毕业设计做网站好做吗南京seo推广公司
  • 二手交易网站建设2021网络营销成功案例
  • 潍坊优化网站排名靠前seo网站营销推广
  • 如何做原创小说网站百度云登录入口
  • thinkphp网站开发实战教程软件培训机构排名
  • 网站怎么引蜘蛛林哥seo
  • 橙光游戏制作器手机版南昌seo搜索优化
  • 百胜网站建设seo外包网站
  • 北京网站建设排名百度seo排名培训 优化
  • 做医院健康专题网站百度地图关键词优化
  • 网站内页banner一般做多高百度下载安装2019
  • 东莞网站seminar怎么读
  • 滨州内做网站系统的公司站长素材
  • 宁波北仑做网站厦门seo
  • rob为翁美玲做的网站房地产营销策略有哪些