mirror of
https://github.com/metabarcoding/obitools4.git
synced 2025-06-29 16:20:46 +00:00
Last changes on blackboard
This commit is contained in:
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,10 @@ 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
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,9 +19,18 @@ type Blackboard struct {
|
|||||||
BoardLock *sync.Mutex
|
BoardLock *sync.Mutex
|
||||||
Runners map[string]Runner
|
Runners map[string]Runner
|
||||||
Running *obiutils.Counter
|
Running *obiutils.Counter
|
||||||
|
TargetSize int
|
||||||
Size 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 {
|
||||||
board := make(map[int]Queue, 0)
|
board := make(map[int]Queue, 0)
|
||||||
runners := make(map[string]Runner, 0)
|
runners := make(map[string]Runner, 0)
|
||||||
@ -33,20 +44,24 @@ func NewBlackBoard(size int) *Blackboard {
|
|||||||
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
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user