golang sync.Pool包的使用和一些注意地方
- package main;
- import (
- "sync"
- "fmt"
- "net"
- "runtime"
- )
- //sync.Pool是一个可以存或取的临时对象集合
- //sync.Pool可以安全被多个线程同时使用,保证线程安全
- //注意、注意、注意,sync.Pool中保存的任何项都可能随时不做通知的释放掉,所以不适合用于像socket长连接或数据库连接池。
- //sync.Pool主要用途是增加临时对象的重用率,减少GC负担。
- func testTcpConnPool() {
- sp2 := sync.Pool{
- New: func() interface{} {
- conn, err := net.Dial("tcp", ":80");
- if err != nil {
- return nil;
- }
- return conn;
- },
- };
- buf := make([]byte, 1024);
- //获取对象
- conn := sp2.Get().(net.Conn);
- //使用对象
- conn.Write([]byte("GET / HTTP/1.1 \r\n\r\n"));
- n, _ := conn.Read(buf);
- fmt.Println("conn read : ", string(buf[:n]));
- //打印conn的地址
- fmt.Println(conn);
- //把对象放回池中
- sp2.Put(conn);
- //我们人为的进行一次垃圾回收
- runtime.GC();
- //再次获取池中的对象
- conn2 := sp2.Get().(net.Conn);
- //这时发现conn2的地址与上面的conn的地址不一样了
- //说明池中我们之前放回的对象被全部清除了,显然这并不是我们想看到的
- //所以sync.Pool不适合用于scoket长连接或数据库连接池
- fmt.Println(conn2);
- }
- func main() {
- //我们创建一个Pool,并实现New()函数
- sp := sync.Pool{
- //New()函数的作用是当我们从Pool中Get()对象时,如果Pool为空,则先通过New创建一个对象,插入Pool中,然后返回对象。
- New: func() interface{} {
- return make([]int, 16);
- },
- };
- item := sp.Get();
- //打印可以看到,我们通过New返回的大小为16的[]int
- fmt.Println("item : ", item);
- //然后我们对item进行操作
- //New()返回的是interface{},我们需要通过类型断言来转换
- for i := 0; i < len(item.([]int)); i++ {
- item.([]int)[i] = i;
- }
- fmt.Println("item : ", item);
- //使用完后,我们把item放回池中,让对象可以重用
- sp.Put(item);
- //再次从池中获取对象
- item2 := sp.Get();
- //注意这里获取的对象就是上面我们放回池中的对象
- fmt.Println("item2 : ", item2);
- //我们再次获取对象
- item3 := sp.Get();
- //因为池中的对象已经没有了,所以又重新通过New()创建一个新对象,放入池中,然后返回
- //所以item3是大小为16的空[]int
- fmt.Println("item3 : ", item3);
- //测试sync.Pool保存socket长连接池
- testTcpConnPool();
- }
golang sync.Pool包的使用和一些注意地方的更多相关文章
- 深入Golang之sync.Pool详解
我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool ...
- Golang 临时对象池 sync.Pool
Go 1.3 的sync包中加入一个新特性:Pool.官方文档可以看这里http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低 ...
- golang语言中sync/atomic包的学习与使用
package main; import ( "sync/atomic" "fmt" "sync" ) //atomic包提供了底层的原子级 ...
- 【记录一个问题】golang中使用sync.Pool反而造成了负优化
之前有这样的代码:从http收数据后,进行snappy解码: dst := make([]byte, 0, len(httpRequestData)*5) dst, err = snappy.Deco ...
- go语言学习--go的临时对象池--sync.Pool
一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力.一个比较好的例子是fmt包,fmt包总 ...
- [Go] sync.Pool 的实现原理 和 适用场景
摘录一: Go 1.3 的 sync 包中加入一个新特性:Pool. 官方文档可以看这里 http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以 ...
- go的临时对象池--sync.Pool
作者:bigtom链接:https://www.jianshu.com/p/2bd41a8f2254來源:简书 一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用 ...
- 深度解密 Go 语言之 sync.Pool
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底.准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗.为了用起来更顺畅,我特地研究了 ...
- 多图详解Go的sync.Pool源码
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 Pool介绍 总所周知Go 是一个自动垃圾回收的编程语言 ...
随机推荐
- MySql出现大量LAST_ACK的解决办法
前几日生产环境遇到一问题,网站的同步登录部分提示Can’t connect to MySQL server on ‘localhost’ (10060),第一反应就是可能过连接数据库的相关参数了,经检 ...
- How to Pronounce Work vs. Walk
How to Pronounce Work vs. Walk Share Tweet Share Tagged With: Comparison If you’re confused about th ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- 如何遍历Map对象
方法一 通过Map.entrySet遍历key和value,在for-each循环中使用entries来遍历.推荐,尤其是容量大时 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使 ...
- [PHP]对Json字符串解码返回NULL的一般解决方案
---------------------------------------------------------------------------------------------------- ...
- C# 汉字转拼音(全拼)
C# 汉字转拼音(全拼) 很多时候我们需要把汉字转换成拼音,比如姓名.城市名等.网上搜索了一把,把汉字转成拼音的代码很多,但大多都只是把汉字转成了拼音的首字母,比如把“深圳”转成了“sz”.那 ...
- shiro 会话管理
- reids遇到问题
今天重启爬虫服务器在连接redis数据库时突然报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not ...
- pyspark 逻辑回归程序
http://www.qqcourse.com/forum.php?mod=viewthread&tid=3688 [很重要]:http://spark.apache.org/docs/lat ...
- Python+Appium自动化环境搭建
appium工作原理 appium 在android端工作流 client端也就是我们 test script是我们的webdriver测试脚本. 中间是起的Appium的服务,Appium在服务端起 ...