我正在实现一个 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 拥有唯一的引用,则该项目可能会被释放。
池很可能删除了您使用的连接。
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报
0/150
提交
取消