为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止sync.Pool创建两个实例

如何防止sync.Pool创建两个实例

Go
慕姐4208626 2022-06-01 16:19:57
我正在实现一个 TCP 连接池以记录到流利的位,这是代码import (    "fmt"    "log"    "net"    "sync")type FluentConnectionPool struct {    sync.Mutex    pool          *sync.Pool}func (fl *FluentConnectionPool) Log(message string) {    fl.Lock()    defer fl.Unlock()    conn := fl.pool.Get().(*net.TCPConn)    defer fl.pool.Put(conn)    fmt.Printf("using: %v\n", conn.LocalAddr())    if _, err := conn.Write([]byte(message)) ; err != nil {        log.Fatal(err)    }}func (fl *FluentConnectionPool) Close() {    conn := fl.pool.Get().(*net.TCPConn)    defer conn.Close()    fmt.Printf("Closing: %v\n", conn.LocalAddr())}func New(address string) (*FluentConnectionPool, error) {    fluentAddress, err := net.ResolveTCPAddr("tcp", address)    if err != nil {        return nil, err    }    pool := &sync.Pool{New: func() interface{} {        connection, _ := net.DialTCP("tcp", nil, fluentAddress)        return connection    }}    return &FluentConnectionPool{        pool:          pool,    }, nil}当我像这样测试代码时import "time"func main() {    pool, _ := New("localhost:5170")    defer pool.Close()    for i := 0 ; i < 10 ; i++ {        go func() {               pool.Log(`{"data": {"name": "name here"}}`)        }()    }    time.Sleep(1 * time.Second)}输出是这样的using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43990using: 127.0.0.1:43994Closing: 127.0.0.1:43994我不明白为什么连接创建两次(43990 和 43994)即使我已经锁定了功能,所以 43990 上的连接仍然打开,你能解释一下为什么会这样吗?
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

Pool文档中的这可能解释了这种行为:

存储在池中的任何项目都可能随时自动删除,恕不另行通知。如果在发生这种情况时 Pool 拥有唯一的引用,则该项目可能会被释放。

池很可能删除了您使用的连接。


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信