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

正规网站建设找哪家好wordpress菜单html5

正规网站建设找哪家好,wordpress菜单html5,网站 ip pv,您身边的网站建设专家简介 在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.yayakq.cn/news/101856/

相关文章:

  • 盐城市城乡建设局网站网站建设制作收费
  • wordpress 静态化 插件哪些网站可以做seo
  • 在网上做效果图的网站.net做的大型网站吗
  • 网站开发连接效果软文推广策划方案
  • 网站上线流程图小程序开发工具编辑器
  • 夹江企业网站建设报价九易建网站的建站流程
  • 桂林网站建设凡森网络上街区网站建设
  • 云南网站推广的目的用dw做的网站能用吗
  • 网站建设策划怎么沟通怀化网站优化公司推荐
  • 360免费建站视频亚马逊做超链接的网站
  • 互动平台网站建设福州仓山区网站建设
  • 郑州制作网站的基本流程如何让WordPress快起来
  • 网站收录怎么删佳木斯企业网站建设
  • 做网站自学做app需要学什么
  • 长春财经学院是公办还是民办广州seo优化费用
  • 建设部网站13清单网站开发w亿玛酷1流量订制
  • 镜像网站做优化微信营销推广怎么做
  • 一个网站想看访客量怎么做微信游戏网站开发
  • 用xp做网站是否先搭建iis在线直播网站开发
  • 做网站ui设计多少钱网站建设建设意见
  • 要进一步增强门户网站建设合力网站建设内部风险分析
  • 河北省建设执业注册中心网站职业生涯规划大赛作品
  • 外贸网站服务器巩义seo
  • php旅游类网站开发wordpress 商品 模板下载
  • 建设银行大连市分行网站广告设计软件哪个好
  • 个人如何优化网站有哪些方法阿里云网站开发
  • 郑州网站seo诊断什么网站可以做任务领赏金
  • 网站系统说明书一般网站如何做防采集的
  • 保定市城市规划建设局网站网站制作学校
  • 温州seo建站柳州建设局网站