package engine import ( "context" "log" "strconv" "time" ) type FirstEngine struct { Scheduler Scheduler WorkCount int Work func(request Request) (Response, error) } type Scheduler interface { Submit(request Request) ConfigChan() chan Request Run() WorkReady(chan Request) } var ctx context.Context func (e *FirstEngine) CreateWorker(in chan Request, out chan Response) { go func() { for { e.Scheduler.WorkReady(in) req := <-in work, err := e.Work(req) if err != nil { log.Printf("work:%v err: %v", req, err) //出错之后让其他线程重新调度 e.Scheduler.Submit(req) } else { out <- work } } }() } func (e *FirstEngine) Run(num int) { out := make(chan Response) e.Scheduler.Run() start := time.Now() for i := 0; i < e.WorkCount; i++ { e.CreateWorker(e.Scheduler.ConfigChan(), out) } log.Printf("time slice 1: %d", time.Since(start)/time.Millisecond) for i := 0; i < num; i++ { e.Scheduler.Submit(Request{Id: strconv.Itoa(i), Dlock: "redis_lock"}) } log.Printf("time slice 2: %d", time.Since(start)/time.Millisecond) i := 0 for id := range out { i++ log.Println(id.Id) if i >= num { close(out) } } log.Printf("time slice 3: %d", time.Since(start)/time.Millisecond) }