golang 语言提供非常好用的channel模型,做一些小的并发控制任务非常方便 ,以下实现一个任务前驱后继管理模块
(其实golang 的sync.WaitGroup提供了类似的功能)
任务驱后继关系如下,所有的任务签名如下均为 func ()
fn9 的执行必须要等待fn10的执行完成,依次次类推
fn10
/ |
/ |
fn9 | fn6
/ \ |
/ \ |
/ \ |
fn7 fn8
package main
import (
"fmt"
"time"
)
type (
Scheduler struct {
tasks []*Task
}
Task struct {
fn *func()
befores []chan int // predecessor tasks
afters []chan int // subsequent tasks
}
)
func NewScheduler() *Scheduler {
return &Scheduler{}
}
func (s *Scheduler) Before(after *func(), before ...*func()) {
afterTask, existesAfter := s.getTask(after)
for _, bef := range before {
c := make(chan int, 1)
getChan, existesBef := s.getTask(bef)
getChan.afters = append(getChan.afters, c)
afterTask.befores &