私はexec.Commandコマンドを実行したいと思いますが、失敗した場合は、テストのために定義した時間Xで再試行します。このようなことをやっています。テストtime.AfterFunc
のために:サーキットブレーカのデザインパターンsleep vs time.AfterFunc
package main
import (
"fmt"
"os/exec"
"time"
)
func Exec(done chan<- error) error {
cmd := exec.Command("./start")
if err := cmd.Start(); err != nil {
return err
}
go func() {
done <- cmd.Wait()
}()
return nil
}
func main() {
var (
run = make(chan struct{}, 1)
done = make(chan error, 1)
)
Exec(done)
for {
select {
case <-run:
err := Exec(done)
if err != nil {
fmt.Println(err)
// time.AfterFunc(3*time.Second, func() {
time.Sleep(3 * time.Second)
run <- struct{}{}
}
default:
select {
case err := <-done:
fmt.Println(err)
run <- struct{}{}
}
}
}
}
:下記の例のための
package main
import (
"fmt"
"time"
)
func myFunc() error {
for i := 1; i < 10; i++ {
fmt.Printf("i = %+v\n", i)
if i%3 == 0 {
return fmt.Errorf("error")
}
}
return nil
}
func main() {
run := make(chan struct{}, 1)
run <- struct{}{}
for {
select {
case <-run:
err := myFunc()
if err != nil {
time.AfterFunc(3*time.Second, func() {
run <- struct{}{}
})
}
default:
}
}
}
time.AfterFunc
上記のコードのための作品ではなく、私が期待される結果を達成するためにsleep
と交換しなければなりませんでした210
./sleep
の内容:
#!/bin/sh
sleep 3
とテストのための
、エラーを作成し、私は切り替えパーマ:そこで疑問に思っchmod -x sleep
chmod +x sleep
time.AfterFunc
とtime.Sleep
を使用して、最高の何ができるかの違いは何ですかこのパターンを実装する方法。
上の例では、再試行時間が完了するまでエラーが発生すると、ビジー待機をしています。 AfterFuncが実行されるまで、ループはできるだけ速く実行されます。 – captncraig
**予想される結果**は達成できませんか? 3秒間待たずに、パニックになりますか? – sberry
@sberryはい、基本的には、もう一度やり直す前にXの時間を待っています。 – nbari