commandInvoker.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package goroutine
  2. import (
  3. "log"
  4. "sync"
  5. )
  6. // 定义命令接口,所有命令需要实现这个接口
  7. type AsyncCommand interface {
  8. Execute()
  9. }
  10. // 定义结构体来管理更新排名分数的逻辑
  11. type AsyncCommandInvoke struct {
  12. wg sync.WaitGroup
  13. CmdChan chan AsyncCommand
  14. }
  15. func NewAsyncCommandInvoke(chanSize int) *AsyncCommandInvoke {
  16. aci := new(AsyncCommandInvoke)
  17. aci.CmdChan = make(chan AsyncCommand, chanSize)
  18. return aci
  19. }
  20. // 启动并发执行更新排名分数命令的方法
  21. func (aci *AsyncCommandInvoke) StartExecuting() {
  22. safeDo := func(cmd AsyncCommand) {
  23. defer func() {
  24. if err := recover(); err != nil {
  25. log.Printf("AsyncCommandInvoke StartExecuting recover error: %v", err)
  26. }
  27. }()
  28. cmd.Execute()
  29. }
  30. aci.wg.Add(1)
  31. go func() {
  32. defer aci.wg.Done()
  33. for command := range aci.CmdChan {
  34. safeDo(command)
  35. }
  36. }()
  37. }
  38. // 停止执行更新排名分数命令(通过关闭通道来触发)
  39. func (aci *AsyncCommandInvoke) StopExecuting() {
  40. close(aci.CmdChan)
  41. aci.wg.Wait() // 等待所有goroutine完成
  42. }
  43. func (aci *AsyncCommandInvoke) AndCmd(ac AsyncCommand) {
  44. aci.CmdChan <- ac
  45. }