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"
"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 {
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 {
func r2(bb *obiblackboard.Blackboard, task *obiblackboard.Task) *obiblackboard.Task {
fmt.Printf("value : %v\n", task.Body)
return obiblackboard.NewInitialTask()
}
func rmul(task *obiblackboard.Task) *obiblackboard.Task {
func rmul(bb *obiblackboard.Blackboard, task *obiblackboard.Task) *obiblackboard.Task {
nt := task.GetNext()
nt.Body = task.Body.(int) * 2
return nt
@ -38,9 +21,9 @@ func main() {
black := obiblackboard.NewBlackBoard(20)
black.RegisterRunner("todisplay", "initial", r2)
black.RegisterRunner("todisplay", "final", r2)
black.RegisterRunner("multiply", "todisplay", rmul)
black.RegisterRunner("initial", "multiply", MakeCounter(1000))
black.RegisterRunner("initial", "multiply", obiblackboard.DoCount(1000).RepeatTask(4))
black.Run()
}

View File

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