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