goRedisDLM/engine/firstengine.go
2025-02-06 16:48:15 +08:00

63 lines
1.1 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 err: %v", err)
}
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)
}