• Go对象池


    对象池是经常会用到的一个功能,使用 buffer channel 实现

    package obj_pool
    
    import (
    	"errors"
    	"time"
    )
    
    type ReusableObj struct{}
    
    type ObjPool struct {
    	bufChan chan *ReusableObj // 用于缓冲可重用对象
    }
    
    func NewObjPool(numOfObj int) *ObjPool {
    	ObjPool := ObjPool{}
    	ObjPool.bufChan = make(chan *ReusableObj, numOfObj) // numOfObj 表示迟的大小
    	for i := 0; i < numOfObj; i++ {
    		ObjPool.bufChan <- &ReusableObj{}
    	}
    	return &ObjPool
    }
    
    func (p *ObjPool) GetObj(timeout time.Duration) (*ReusableObj, error) {
    	select {
    	case ret := <-p.bufChan:
    		return ret, nil
    	case <-time.After(timeout): // 超时控制
    		return nil, errors.New("time out")
    	}
    }
    
    func (p *ObjPool) ReleaseObj(obj *ReusableObj) error {
    	select {
    	case p.bufChan <- obj:
    		return nil
    	default:
    		return errors.New("overflow")
    	}
    }
    

    下面是针对上面代码的测试程序

    package obj_pool
    
    import (
    	"fmt"
    	"testing"
    	"time"
    )
    
    func TestObjPool(t *testing.T) {
    	pool := NewObjPool(10)
    	// 测试 overflow
    	//if err := pool.ReleaseObj(&ReusableObj{}); err != nil{
    	//	t.Error(err)
    	//}
    	for i := 0; i < 11; i++ {
    		if v, err := pool.GetObj(time.Second * 1); err != nil {
    			t.Error(err)
    		} else {
    			fmt.Printf("%T
    ", v)
    			if err := pool.ReleaseObj(v); err != nil {
    				t.Error(err)
    			}
    		}
    	}
    	fmt.Println("Done!")
    }
    

    对象池适用于复杂难于创建的对象,对于简单容易创建的对象不适用。

  • 相关阅读:
    总结mysql服务器查询慢原因与解决方法
    mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法
    Github 终于开始认真考虑开源项目许可证了
    mysql 外连接总结
    MYSQL--事务处理
    MySQL 索引详解
    MySQL数据库优化总结
    Delphi 2010 安装及调试
    Delphi 2010
    PostgreSQL 8.4.1
  • 原文地址:https://www.cnblogs.com/wuyongqiang/p/12143728.html
Copyright © 2020-2023  润新知