1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package goroutine
- import (
- "log"
- "sync"
- )
- // 定义命令接口,所有命令需要实现这个接口
- type AsyncCommand interface {
- Execute()
- }
- // 定义结构体来管理更新排名分数的逻辑
- type AsyncCommandInvoke struct {
- wg sync.WaitGroup
- CmdChan chan AsyncCommand
- }
- func NewAsyncCommandInvoke(chanSize int) *AsyncCommandInvoke {
- aci := new(AsyncCommandInvoke)
- aci.CmdChan = make(chan AsyncCommand, chanSize)
- return aci
- }
- // 启动并发执行更新排名分数命令的方法
- func (aci *AsyncCommandInvoke) StartExecuting() {
- safeDo := func(cmd AsyncCommand) {
- defer func() {
- if err := recover(); err != nil {
- log.Printf("AsyncCommandInvoke StartExecuting recover error: %v", err)
- }
- }()
- cmd.Execute()
- }
- aci.wg.Add(1)
- go func() {
- defer aci.wg.Done()
- for command := range aci.CmdChan {
- safeDo(command)
- }
- }()
- }
- // 停止执行更新排名分数命令(通过关闭通道来触发)
- func (aci *AsyncCommandInvoke) StopExecuting() {
- close(aci.CmdChan)
- aci.wg.Wait() // 等待所有goroutine完成
- }
- func (aci *AsyncCommandInvoke) AndCmd(ac AsyncCommand) {
- aci.CmdChan <- ac
- }
|