Go语言生产者消费者模型

2023/04/28

Tags: Go


type Request struct {
    Name string
}

type XxHandler struct {
    RequestQueue chan *Request
}

func (o *XxHandler) String() string {
    if b, err := json.Marshal(o); err != nil {
        return ""
    } else {
        return string(b)
    }
}

// Start 启动队列监听
func (o *XxHandler) Start() {
    go func() {
        for request := range o.RequestQueue {
            go o.Process(request)
        }
    }()
}

// AppendTask 向队列中增加task
func (o *XxHandler) AppendTask(request *Request) {
    if request == nil {
        return
    }
    o.RequestQueue <- request
}

// Stop 关闭队列
func (o *XxHandler) Stop() {
    close(o.RequestQueue)
}

func newIns() *XxHandler {
    return &XxHandler{
        RequestQueue: make(chan *Request, 10),
    }
}

var ins *XxHandler

// GetXxHandler 获取 实例
func GetXxHandler() *XxHandler {
    if ins == nil {
        ins = newIns()
    }
    return ins
}

// Process 处理队列中的任务
func (o *XxHandler) Process(request *Request) {
    // do something
}

func TestXxHandler(t *testing.T) {
    GetXxHandler().Start()

    GetXxHandler().AppendTask(&Request{Name: "xx"})
}