1. package main;
  2.  
  3. import (
  4. "sync"
  5. "fmt"
  6. "net"
  7. "runtime"
  8. )
  9.  
  10. //sync.Pool是一个可以存或取的临时对象集合
  11. //sync.Pool可以安全被多个线程同时使用,保证线程安全
  12. //注意、注意、注意,sync.Pool中保存的任何项都可能随时不做通知的释放掉,所以不适合用于像socket长连接或数据库连接池。
  13. //sync.Pool主要用途是增加临时对象的重用率,减少GC负担。
  14.  
  15. func testTcpConnPool() {
  16. sp2 := sync.Pool{
  17. New: func() interface{} {
  18. conn, err := net.Dial("tcp", ":80");
  19. if err != nil {
  20. return nil;
  21. }
  22. return conn;
  23. },
  24. };
  25. buf := make([]byte, 1024);
  26. //获取对象
  27. conn := sp2.Get().(net.Conn);
  28. //使用对象
  29. conn.Write([]byte("GET / HTTP/1.1 \r\n\r\n"));
  30. n, _ := conn.Read(buf);
  31. fmt.Println("conn read : ", string(buf[:n]));
  32. //打印conn的地址
  33. fmt.Println(conn);
  34. //把对象放回池中
  35. sp2.Put(conn);
  36. //我们人为的进行一次垃圾回收
  37. runtime.GC();
  38. //再次获取池中的对象
  39. conn2 := sp2.Get().(net.Conn);
  40. //这时发现conn2的地址与上面的conn的地址不一样了
  41. //说明池中我们之前放回的对象被全部清除了,显然这并不是我们想看到的
  42. //所以sync.Pool不适合用于scoket长连接或数据库连接池
  43. fmt.Println(conn2);
  44. }
  45.  
  46. func main() {
  47. //我们创建一个Pool,并实现New()函数
  48. sp := sync.Pool{
  49. //New()函数的作用是当我们从Pool中Get()对象时,如果Pool为空,则先通过New创建一个对象,插入Pool中,然后返回对象。
  50. New: func() interface{} {
  51. return make([]int, 16);
  52. },
  53. };
  54. item := sp.Get();
  55. //打印可以看到,我们通过New返回的大小为16的[]int
  56. fmt.Println("item : ", item);
  57.  
  58. //然后我们对item进行操作
  59. //New()返回的是interface{},我们需要通过类型断言来转换
  60. for i := 0; i < len(item.([]int)); i++ {
  61. item.([]int)[i] = i;
  62. }
  63. fmt.Println("item : ", item);
  64.  
  65. //使用完后,我们把item放回池中,让对象可以重用
  66. sp.Put(item);
  67.  
  68. //再次从池中获取对象
  69. item2 := sp.Get();
  70. //注意这里获取的对象就是上面我们放回池中的对象
  71. fmt.Println("item2 : ", item2);
  72. //我们再次获取对象
  73. item3 := sp.Get();
  74. //因为池中的对象已经没有了,所以又重新通过New()创建一个新对象,放入池中,然后返回
  75. //所以item3是大小为16的空[]int
  76. fmt.Println("item3 : ", item3);
  77.  
  78. //测试sync.Pool保存socket长连接池
  79. testTcpConnPool();
  80. }

golang sync.Pool包的使用和一些注意地方的更多相关文章

  1. 深入Golang之sync.Pool详解

    我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool ...

  2. Golang 临时对象池 sync.Pool

    Go 1.3 的sync包中加入一个新特性:Pool.官方文档可以看这里http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低 ...

  3. golang语言中sync/atomic包的学习与使用

    package main; import ( "sync/atomic" "fmt" "sync" ) //atomic包提供了底层的原子级 ...

  4. 【记录一个问题】golang中使用sync.Pool反而造成了负优化

    之前有这样的代码:从http收数据后,进行snappy解码: dst := make([]byte, 0, len(httpRequestData)*5) dst, err = snappy.Deco ...

  5. go语言学习--go的临时对象池--sync.Pool

    一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力.一个比较好的例子是fmt包,fmt包总 ...

  6. [Go] sync.Pool 的实现原理 和 适用场景

    摘录一: Go 1.3 的 sync 包中加入一个新特性:Pool. 官方文档可以看这里 http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以 ...

  7. go的临时对象池--sync.Pool

    作者:bigtom链接:https://www.jianshu.com/p/2bd41a8f2254來源:简书   一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用 ...

  8. 深度解密 Go 语言之 sync.Pool

    最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底.准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗.为了用起来更顺畅,我特地研究了 ...

  9. 多图详解Go的sync.Pool源码

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 Pool介绍 总所周知Go 是一个自动垃圾回收的编程语言 ...

随机推荐

  1. MySql出现大量LAST_ACK的解决办法

    前几日生产环境遇到一问题,网站的同步登录部分提示Can’t connect to MySQL server on ‘localhost’ (10060),第一反应就是可能过连接数据库的相关参数了,经检 ...

  2. How to Pronounce Work vs. Walk

    How to Pronounce Work vs. Walk Share Tweet Share Tagged With: Comparison If you’re confused about th ...

  3. RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)

    RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...

  4. 如何遍历Map对象

    方法一 通过Map.entrySet遍历key和value,在for-each循环中使用entries来遍历.推荐,尤其是容量大时 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使 ...

  5. [PHP]对Json字符串解码返回NULL的一般解决方案

    ---------------------------------------------------------------------------------------------------- ...

  6. C# 汉字转拼音(全拼)

    C# 汉字转拼音(全拼)     很多时候我们需要把汉字转换成拼音,比如姓名.城市名等.网上搜索了一把,把汉字转成拼音的代码很多,但大多都只是把汉字转成了拼音的首字母,比如把“深圳”转成了“sz”.那 ...

  7. shiro 会话管理

  8. reids遇到问题

    今天重启爬虫服务器在连接redis数据库时突然报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not ...

  9. pyspark 逻辑回归程序

    http://www.qqcourse.com/forum.php?mod=viewthread&tid=3688 [很重要]:http://spark.apache.org/docs/lat ...

  10. Python+Appium自动化环境搭建

    appium工作原理 appium 在android端工作流 client端也就是我们 test script是我们的webdriver测试脚本. 中间是起的Appium的服务,Appium在服务端起 ...