parent
9d1b046d30
commit
186b7eeda0
@ -0,0 +1,8 @@ |
||||
{ |
||||
"Processes": { |
||||
"tester1": { |
||||
"Command": "tester", |
||||
"Args": ["-count", "100", "-id", "1"] |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,38 @@ |
||||
package config |
||||
|
||||
import ( |
||||
"flag" |
||||
"log" |
||||
"os" |
||||
"os/exec" |
||||
"encoding/json" |
||||
) |
||||
|
||||
type Process struct { |
||||
Command string |
||||
Args []string |
||||
Ready chan string |
||||
ExecCmd *exec.Cmd |
||||
} |
||||
|
||||
type config struct { |
||||
Processes map[string]Process |
||||
ConfigPath string |
||||
} |
||||
|
||||
var Settings config |
||||
|
||||
func parseFlags(c *config) { |
||||
flag.StringVar(&c.ConfigPath, "config", ".ttarpit.json", ".ttarpit.json to load") |
||||
flag.Parse() |
||||
} |
||||
|
||||
func Load() { |
||||
parseFlags(&Settings) |
||||
|
||||
data, err := os.ReadFile(Settings.ConfigPath) |
||||
if err != nil { log.Fatal(err) } |
||||
|
||||
err = json.Unmarshal(data, &Settings) |
||||
if err != nil { log.Fatal(err) } |
||||
} |
||||
@ -0,0 +1,72 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"time" |
||||
"flag" |
||||
"sync" |
||||
) |
||||
|
||||
func Worker(name string, count int, done chan<- int, stop <-chan int) { |
||||
for i := 0; i < count; i++ { |
||||
select { |
||||
case <-stop: |
||||
fmt.Println("Worker stopped:", name) |
||||
done<- 1 |
||||
return |
||||
default: |
||||
time.Sleep(1 * time.Second) |
||||
fmt.Println("TESTER #", name) |
||||
} |
||||
} |
||||
|
||||
done<- 1 |
||||
} |
||||
|
||||
func Supervisor(id int, count int) { |
||||
stop := make(chan int) |
||||
var wg sync.WaitGroup |
||||
|
||||
for i := 0; i < 5; i++ { |
||||
wg.Add(1) |
||||
go func() { |
||||
defer wg.Done() |
||||
|
||||
for { |
||||
workerDone := make(chan int) |
||||
go Worker(fmt.Sprintf("%d:%d", id, i), count, workerDone, stop) |
||||
|
||||
select { |
||||
case <-workerDone: |
||||
fmt.Println("Supervisor: Worker Done") |
||||
time.Sleep(500 * time.Millisecond) |
||||
case <-stop: |
||||
fmt.Println("Supervisor: Stop") |
||||
return |
||||
} |
||||
} |
||||
}() |
||||
} |
||||
|
||||
/* |
||||
go func() { |
||||
// test shutdown
|
||||
time.Sleep(10000 * time.Millisecond) |
||||
close(stop) |
||||
}() |
||||
*/ |
||||
|
||||
wg.Wait() |
||||
} |
||||
|
||||
|
||||
func main() { |
||||
count := flag.Int("count", 10, "Seconds to wait") |
||||
|
||||
id := flag.Int("id", 1, "Tester ID to use.") |
||||
flag.Parse() |
||||
|
||||
fmt.Println(">>> TESTER STARTS, id=", *id, "count=", *count) |
||||
|
||||
Supervisor(*id, *count) |
||||
} |
||||
Loading…
Reference in new issue