Golang 新旧模型对比:任务和worker
在Golang中,新旧模型对于"任务和工人"的处理方式有显著的不同。以下是一个简化的例子,展示了如何在新模型中实现类似的功能。
package main
import (
"context"
"fmt"
"sync"
)
// 任务接口
type Task interface {
Process(ctx context.Context) error
}
// 工人结构体
type Worker struct {
tasks chan Task
wg sync.WaitGroup
}
// 创建新工人
func NewWorker(maxTasks int) *Worker {
return &Worker{
tasks: make(chan Task, maxTasks),
}
}
// 启动工人
func (w *Worker) Start() {
w.wg.Add(1)
go func() {
defer w.wg.Done()
for task := range w.tasks {
if err := task.Process(context.Background()); err != nil {
fmt.Println("任务处理失败:", err)
}
}
}()
}
// 停止工人
func (w *Worker) Stop() {
close(w.tasks)
w.wg.Wait()
}
// 向工人添加任务
func (w *Worker) Do(t Task) {
w.tasks <- t
}
// 示例任务
type exampleTask struct{}
// 实现Process方法
func (t *exampleTask) Process(ctx context.Context) error {
fmt.Println("处理任务...")
// 模拟任务处理
return nil
}
func main() {
worker := NewWorker(10)
worker.Start()
task := &exampleTask{}
worker.Do(task)
// 假设在这里执行了一些逻辑...
worker.Stop()
}
在这个例子中,我们定义了一个Task
接口和一个Worker
结构体。Task
接口要求任何实现的类型必须实现Process
方法,这个方法将在工人goroutine中被调用来处理任务。Worker
结构体维护一个任务通道,并提供了启动和停止工作的方法。
这个模型使用了Go语言的context
包来提供任务处理的上下文,并使用sync.WaitGroup
来等待所有goroutine完成。这个模型是非阻塞的,并且可以很容易地扩展来处理多个任务和工人。
评论已关闭