老师好
在简单调度器这里,有一些不太清楚的地方希望老师能给解惑一下。
主要是关于结构体和接口这里的设计理念问题。
关于简单调度器
首先我们先做了一个并发版的引擎
type ConcurrentEngine struct {
}
之后我们围绕并发版引擎做了一些方法。比如submit
这时候就有了
type Scheduler interface {
Submit()
}
好了问题来了。
这里老师给的代码是
e.Scheduler.Submit(r)
然后在
ConcurrentEngine 肚子里放了调度器
我想问下
通过代码
e.Submit(r)
然后我再写个关于并发引擎的方法来实现这个interface不可以吗?
func (c *ConcurrentEngine)Submit(request Request) {}
老师那样写的好处是什么呢。那里的设计理念和中心思想是什么呢?
还请老师给解惑一下
另外附上自己更改的一部分理解后的代码。麻烦老师给指点下哪里错误了
package engine
import (
"log"
)
type ConcurrentEngine struct {
WorkerCount int
requestChan chan Request
}
type Scheduler interface {
Submit(Request)
}
func (*ConcurrentEngine) Submit(request Request, in chan Request) {
go func() {
in <- request
}()
}
func (c *ConcurrentEngine) Run(Seeds ...Request) {
out := make(chan ParserResult)
c.requestChan = make(chan Request)
for _, req := range Seeds {
c.Submit(req, c.requestChan)
}
for i := 0; c.WorkerCount > i; i++ {
c.createWorker(c.requestChan, out)
}
for {
result := <-out
for _, re := range result.Request {
c.Submit(re, c.requestChan)
}
for _, item := range result.Items {
log.Printf("got item : %s\n", item)
}
}
}
func (*ConcurrentEngine) createWorker(in chan Request, out chan ParserResult) {
go func() {
for {
req := <-in
result, err := Worker(req)
if err != nil {
continue
}
out <- result
}
}()
}