Goタイマと断続器
1、タイマー
Go言語では、タイマは、特定のイベントを所定の時点で実行することができ、タイマの実質は一方向チャネル、timeである.Timer構造体のタイプにはtimeがある.Timeタイプの一方向chanは、以下のように具体的に宣言されています.
初期化は2つの方法でのみ行うことができる:time.NewTimer()とtime.AfterFunc()は、次のコードを参照してください.
タイマのStop()メソッドとReset()メソッドを使用しない場合は、タイマのショートカットメソッドをそのまま使用できます.次のようになります.
タイマが期限切れになる前にStop()を使用すると、エレメントがチャネル内に書き込まれなくなり、チャネルエレメントが存在するgoroutineを受け入れるのを待つだけでブロックされ、停止したタイマを復元する唯一の方法はReset()メソッドを使用してリセットすることである.タイマを多重化することができ、特にforサイクルで多重化することで、プログラムのリソース占有量を低減することができ、この場合、Reset()メソッドがタイマをリセットする必要がある.
2、断続器
Goは、あるタスクを複数回実行するツールを提供し、実質的に一方向チャネル、time.構造体タイプにはtimeがある.Timeタイプの一方向chanは、以下のように具体的に宣言されています.
次のコードを使用して、次のようにして、新しいTicker()を使用して割り込みを初期化します.
遮断器のStop()メソッドを使用しない場合は、次のように遮断器のショートカットメソッドを直接使用できます.
Go言語では、タイマは、特定のイベントを所定の時点で実行することができ、タイマの実質は一方向チャネル、timeである.Timer構造体のタイプにはtimeがある.Timeタイプの一方向chanは、以下のように具体的に宣言されています.
type Timer struct {
C <-chan Time
r runtimeTimer
}
初期化は2つの方法でのみ行うことができる:time.NewTimer()とtime.AfterFunc()は、次のコードを参照してください.
package main
import (
"fmt"
"time"
)
func main() {
// NewTimer d d , ; *Timer , *Timer C(chan time.Time)
t := time.NewTimer(2 * time.Second)
now := time.Now()
fmt.Printf("Now time: %v
", now)
// goroutine, t.C
expire := <-t.C
fmt.Printf("Expire time: %v
", expire)
}
package main
import (
"fmt"
"time"
)
func main() {
var t *time.Timer
f := func() {
fmt.Printf("Expriation time: %v
", time.Now())
fmt.Printf("C`s length: %v
", len(t.C))
}
//
t = time.AfterFunc(1*time.Second, f)
//
time.Sleep(2 * time.Second)
}
タイマのStop()メソッドとReset()メソッドを使用しない場合は、タイマのショートカットメソッドをそのまま使用できます.次のようになります.
package main
import (
"fmt"
"time"
)
func main() {
fmt.Printf("Now time:%v
", time.Now())
c := <-time.After(5 * time.Second)
fmt.Printf("TimeOut. Now :%v
", c)
}
タイマが期限切れになる前にStop()を使用すると、エレメントがチャネル内に書き込まれなくなり、チャネルエレメントが存在するgoroutineを受け入れるのを待つだけでブロックされ、停止したタイマを復元する唯一の方法はReset()メソッドを使用してリセットすることである.タイマを多重化することができ、特にforサイクルで多重化することで、プログラムのリソース占有量を低減することができ、この場合、Reset()メソッドがタイマをリセットする必要がある.
2、断続器
Goは、あるタスクを複数回実行するツールを提供し、実質的に一方向チャネル、time.構造体タイプにはtimeがある.Timeタイプの一方向chanは、以下のように具体的に宣言されています.
type Ticker struct {
C <-chan Time
r runtimeTimer
}
次のコードを使用して、次のようにして、新しいTicker()を使用して割り込みを初期化します.
package main
import (
"fmt"
"time"
)
func main() {
ticks := time.NewTicker(30 * time.Second)
tick := ticks.C
go func() {
// for...range...
for _ = range tick {
fmt.Printf("%vExecute the task.
", time.Now())
// , , ,
_, ok := <-tick
if !ok {
break
}
}
}()
fmt.Printf("Now: %v.
", time.Now())
time.Sleep(5 * time.Minute)
fmt.Println("Done.")
}
遮断器のStop()メソッドを使用しない場合は、次のように遮断器のショートカットメソッドを直接使用できます.
tick := <-time.Tick(5 * time.Second)