これを達成できる方法の1つは、for/selectタイムアウトイディオムを利用することです。これを行うには、いくつかの同様の方法があります。この些細な例を見てみましょう:いいえ、他の場合ならば
package main
import (
"fmt"
"time"
)
func main() {
abort := make(chan struct{})
go func() {
for {
select {
case <-abort:
return
case <-time.After(1 * time.Second):
// replace fmt.Println() with the command you wish to run
fmt.Println("tick")
}
}
}()
// replace time.Sleep() with code waiting for 'abort' command input
time.Sleep(10 * time.Second)
abort <- struct{}{}
}
は、お使いの環境の場所で使用すると、1秒に1回実行されます(この例では)<-time.After():
場合に実行したいコードを動作するように、この例を変更するにはその期間受信することができます。最後に配置したtime.Sleep()
の代わりに、<-time.After():
ケースを中断するコードを入れてabort
チャンネル(または名前を付けて)に<- struct{}{}
を送信します。
注:私は<-abort true
の明瞭さを好むとchan struct{}
は明らかなようであることを考慮していないとして、この答えの以前のバージョンでは、私は、chan bool
として中止していた、私は<- struct{}{}
として、しかし、この例ではそれを変更することにしました特にあなたがパターンに慣れてしまったら、不明瞭ではありません。また
、次のコマンドは、forループの各反復で実行し、タイムアウトを待たず、あなたはその場合default:
作ることができ、を削除すると、別のチャンネルがある場合には、ループの各反復で実行する場合受け取る準備ができていません。
playgroundでこの例を試すことはできますが、syscallsを許可しない場合や、その環境でdefault:
の例を実行することはできません。
func run(stop <-chan struct{}) {
ps := exec.Command("ps")
for {
select {
case <-stop:
return
default:
ps.Run()
//processing the output
}
}
}
そしてgo run(stop)
:睡眠せずに、何度も繰り返し、それを実行するには