ホームページ  >  記事  >  バックエンド開発  >  Go言語でタイマーを設定する方法

Go言語でタイマーを設定する方法

藏色散人
藏色散人オリジナル
2020-12-16 10:59:084850ブラウズ

Go 言語でタイマーを設定する方法: 1. 「time.NewTicker()」メソッドを通じて作成し、設定された間隔に従ってティッカーがトリガーされます; 2. 「time.NewTicker()」メソッドを通じて作成します。 .NewTimer()" メソッド、タイマーは 1 つの単語のみを実行します。 3. "After()" を使用して作成します。

Go言語でタイマーを設定する方法

この記事の環境: Windows 7 システム、Go1.11.2 バージョン、この記事はすべてのブランドのコンピューターに適用されます。

推奨: 「golang チュートリアル

Go 言語でのタイマーの使用

#GO 言語 # では、時間パッケージでタイマーを使用する 3 つの方法が提供されています:

1. 最初の方法: ticker

// A Ticker holds a channel that delivers `ticks' of a clock
// at intervals.
type Ticker struct {
	C <-chan Time // The channel on which the ticks are delivered.
	r runtimeTimer
}

time.NewTicker() を通じて作成されます。このタイプでは、ティッカーは設定された間隔に従って継続的にトリガーされます。アクティブに終了されます。

#2. 2 番目のタイプ: timer##

// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {
	C <-chan Time
	r runtimeTimer
}
pass

time.NewTimer() このタイプのタイマーを作成すると、一度だけ実行されます。もちろん、実行後に timer.Reset() を呼び出すこともできます. タイマーを再度動作させ、間隔を変更できるようにします。

3. 3 番目のタイプ: After()

// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}
コードからわかるように、After( ) 実際には、これはタイマーの糖衣構文です。


以下は、コードによる 3 つのメソッドの使用法を示しています。


1.Ticker

ticker := time.NewTicker(time.Second * 1) // 运行时长
    ch := make(chan int)
    go func() {
        var x int
        for x < 10 {
            select {
            case <-ticker.C:
                x++
                fmt.Printf("%d\n", x)
            }
        }
        ticker.Stop()
        ch <- 0
    }()
    <-ch                                    // 通过通道阻塞,让任务可以执行完指定的次数。
ティッカーはすべてです。 1 秒 1 回トリガー、つまり 1 秒ごとに 1 つのコンテンツがticker.C に追加され、最後に ch に数値を書き込むと、プログラムのブロックが解除され、実行が継続されます。

2.Timer

timer := time.NewTimer(time.Second * 1) // timer 只能按时触发一次,可通过Reset()重置后继续触发。
    go func() {
        var x int
        for {
            select {
            case <-timer.C:
                x++
                fmt.Printf("%d,%s\n", x, time.Now().Format("2006-01-02 15:04:05"))
                if x < 10 {
                    timer.Reset(time.Second * 2)
                } else {
                    ch <- x
                }
            }
        }
    }()
    <-ch
3.After()

// 阻塞一下,等待主进程结束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 没有终止,打印出 over 后会看见在继续执行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍继续执行,只是关闭了 tt.C 通道。")
4. これらの基本的なメソッドを使用できます。独自のスケジュールされたタスク管理を設計する方法。

type jobFunc2 func(j *job)

type job struct {
    jf     jobFunc2
    params map[string]interface{}
    ch     chan int
}

func NewJob() *job {
    return &job{
        params: make(map[string]interface{}),
        ch:     make(chan int),
    }
}

func (j *job) Run(t time.Duration) {
    ticker := time.NewTicker(time.Second * t)
    go func() {
        for {
            select {
            case <-ticker.C:
                j.jf(j)
            case <-j.ch:
                fmt.Println("收到结束指令")
                ticker.Stop()
                break
            }
        }
    }()

}

func main() {
    j := NewJob()
    j.jf = func(jj *job) {
        fmt.Println("定时任务执行...", time.Now().Format("15:04:05 2006-02-01"), jj.params)
    }
    j.params["p1"] = "第一个参数"
    j.params["p2"] = 100
    j.Run(1)

    // 阻塞一下,等待主进程结束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 没有终止,打印出 over 后会看见在继续执行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍继续执行,只是关闭了 tt.C 通道。")
}
いくつかの実行結果のスクリーンショット:

最後に、タスクの実行がチャネルを通じて終了されることを付け加えておきます。

// 阻塞一下,等待主进程结束
    tt := time.NewTimer(time.Second * 10)
    <-tt.C
    fmt.Println("over.")

    <-time.After(time.Second * 4)
    fmt.Println("再等待4秒退出。tt 没有终止,打印出 over 后会看见在继续执行...")
    tt.Stop()
    <-time.After(time.Second * 2)
    fmt.Println("tt.Stop()后, tt 仍继续执行,只是关闭了 tt.C 通道。")
    j.ch <- 0
    <-time.After(time.Second * 2)
    fmt.Println("又等了2秒钟...这两秒钟可以看到 tt 没干活了...")

GO 言語で記述する場合は、
channel

の使用に習熟する必要があります。

以上がGo言語でタイマーを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。