Last changes on blackboard

This commit is contained in:
Eric Coissac
2024-07-29 11:25:54 +02:00
parent cba355cdde
commit dfe2fc3d43
2 changed files with 41 additions and 36 deletions

View File

@ -4,31 +4,14 @@ import (
"fmt" "fmt"
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiblackboard" "git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiblackboard"
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiutils"
) )
func MakeCounter(n int) func(*obiblackboard.Task) *obiblackboard.Task { func r2(bb *obiblackboard.Blackboard, task *obiblackboard.Task) *obiblackboard.Task {
count := obiutils.AtomicCounter()
r1 := func(task *obiblackboard.Task) *obiblackboard.Task {
val := count()
if val < n {
nt := task.GetNext()
nt.Body = val
return nt
}
return nil
}
return r1
}
func r2(task *obiblackboard.Task) *obiblackboard.Task {
fmt.Printf("value : %v\n", task.Body) fmt.Printf("value : %v\n", task.Body)
return obiblackboard.NewInitialTask() return obiblackboard.NewInitialTask()
} }
func rmul(task *obiblackboard.Task) *obiblackboard.Task { func rmul(bb *obiblackboard.Blackboard, task *obiblackboard.Task) *obiblackboard.Task {
nt := task.GetNext() nt := task.GetNext()
nt.Body = task.Body.(int) * 2 nt.Body = task.Body.(int) * 2
return nt return nt
@ -38,9 +21,9 @@ func main() {
black := obiblackboard.NewBlackBoard(20) black := obiblackboard.NewBlackBoard(20)
black.RegisterRunner("todisplay", "initial", r2) black.RegisterRunner("todisplay", "final", r2)
black.RegisterRunner("multiply", "todisplay", rmul) black.RegisterRunner("multiply", "todisplay", rmul)
black.RegisterRunner("initial", "multiply", MakeCounter(1000)) black.RegisterRunner("initial", "multiply", obiblackboard.DoCount(1000).RepeatTask(4))
black.Run() black.Run()
} }

View File

@ -7,17 +7,28 @@ import (
"git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiutils" "git.metabarcoding.org/obitools/obitools4/obitools4/pkg/obiutils"
) )
type DoTask func(*Blackboard, *Task) *Task
type Runner struct { type Runner struct {
Run func(*Task) *Task Run DoTask
To string To string
} }
type Blackboard struct { type Blackboard struct {
Board map[int]Queue Board map[int]Queue
BoardLock *sync.Mutex BoardLock *sync.Mutex
Runners map[string]Runner Runners map[string]Runner
Running *obiutils.Counter Running *obiutils.Counter
Size int TargetSize int
Size int
}
func doFinal(bb *Blackboard, task *Task) *Task {
if bb.Len() > bb.TargetSize {
return nil
}
return NewInitialTask()
} }
func NewBlackBoard(size int) *Blackboard { func NewBlackBoard(size int) *Blackboard {
@ -29,24 +40,28 @@ func NewBlackBoard(size int) *Blackboard {
} }
bb := &Blackboard{ bb := &Blackboard{
Board: board, Board: board,
BoardLock: &sync.Mutex{}, BoardLock: &sync.Mutex{},
Runners: runners, Runners: runners,
Running: obiutils.NewCounter(), Running: obiutils.NewCounter(),
Size: size, TargetSize: size,
Size: 0,
} }
for i := 0; i < size; i++ { for i := 0; i < size; i++ {
bb.PushTask(NewInitialTask()) bb.PushTask(NewInitialTask())
} }
bb.RegisterRunner("final", "initial", doFinal)
return bb return bb
} }
func (bb *Blackboard) RegisterRunner(from, to string, runner func(*Task) *Task) { func (bb *Blackboard) RegisterRunner(from, to string, runner DoTask) {
bb.Runners[from] = Runner{ bb.Runners[from] = Runner{
Run: runner, Run: runner,
To: to} To: to,
}
} }
func (bb *Blackboard) MaxQueue() Queue { func (bb *Blackboard) MaxQueue() Queue {
@ -73,6 +88,7 @@ func (bb *Blackboard) PopTask() *Task {
if len(*q) == 0 { if len(*q) == 0 {
delete(bb.Board, next_task.Priority) delete(bb.Board, next_task.Priority)
} }
bb.Size--
return next_task return next_task
} }
@ -94,6 +110,8 @@ func (bb *Blackboard) PushTask(task *Task) {
*queue = slices.Grow(*queue, 1) *queue = slices.Grow(*queue, 1)
*queue = append((*queue), task) *queue = append((*queue), task)
bb.Size++
} }
} }
@ -107,7 +125,7 @@ func (bb *Blackboard) Run() {
runner, ok := bb.Runners[task.Role] runner, ok := bb.Runners[task.Role]
if ok { if ok {
task = runner.Run(task) task = runner.Run(bb, task)
if task != nil { if task != nil {
task.Role = runner.To task.Role = runner.To
} }
@ -120,7 +138,7 @@ func (bb *Blackboard) Run() {
lock.Done() lock.Done()
} }
parallel := bb.Size - 1 parallel := bb.TargetSize - 1
lock.Add(parallel) lock.Add(parallel)
for i := 0; i < parallel; i++ { for i := 0; i < parallel; i++ {
@ -149,3 +167,7 @@ func (bb *Blackboard) Run() {
lock.Wait() lock.Wait()
} }
func (bb *Blackboard) Len() int {
return bb.Size
}