66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package engine
|
|
|
|
import (
|
|
"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)
|
|
}
|
|
|
|
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)
|
|
}
|