Golang タイマーを閉じる

WBOY
リリース: 2023-05-16 16:24:38
オリジナル
791 人が閲覧しました

Golang は、高パフォーマンスを開発するための最新のプログラミング言語です。そのタイマーは、あらかじめ決められた時間間隔内でいくつかのタスクを実行できる非常に実用的な機能です。ただし、リソースの不必要な浪費やプログラムのクラッシュを避けるために、タイマーを手動でオフにする必要がある場合があります。この記事では、Golang でタイマーをオフにする方法を説明します。

1. タイマーの基本原理

Golang では、time パッケージでタイマー関数を使用できます。タイマーを作成する基本的なコードは次のとおりです。

timer := time.NewTimer(time.Second * 5)
ログイン後にコピー

このコード行は、5 秒後に起動するタイマー インスタンスを作成します。タイマーがトリガーされた後、いくつかのタスクを実行できます。例:

<- timer.C
fmt.Println("定时器已触发!")
ログイン後にコピー

タイマーが期限切れになると、チャネル C に時間を送信します。この時間をチャネルから読み取り、対応するタスクを実行できます。上記のコードは、タイマーが起動したことを証明するテキスト行を出力します。

2. タイマーをオフにする

タイマーの作成方法を学習しました。次に、それをオフにする方法を学ぶ必要があります。 Golang では、Stop() メソッドを使用してタイマーを手動で閉じることができます。このメソッドの機能は単純です。タイマーの実行を停止し、チャネル C がそれ以上メッセージを受信できないようにします。

たとえば、次のコードは 5 秒のタイマーを作成し、3 秒後に手動で閉じます:

timer := time.NewTimer(time.Second * 5)
go func() {
    time.Sleep(time.Second * 3)
    timer.Stop()
}()
<- timer.C
fmt.Println("定时器已触发!")
ログイン後にコピー

この例では、タイマーが作成された後、新しいコルーチンが開始され、 3秒後に手動で閉じます。このタイマーが閉じられたため、チャネル C はメッセージを受信しなくなり、タスクはトリガーされません。

3. タイマーをオフにする際の注意点

タイマーをオフにする手順は簡単そうに見えて、実は注意すべき点がいくつかあります。このセクションでは、タイマー シャットダウンに関するいくつかの一般的な問題と解決策について説明します。

  1. タイマーを閉じるとプログラムがブロックされる可能性があります

前の例では、コルーチンでタイマーを閉じる方法を示しました。メイン プログラムのブロックを避けるため、通常はこのアプローチが最良のアプローチです。しかし、メイン プログラムでタイマーをオフにするとどうなるでしょうか?

たとえば、次のコードは 5 秒のタイマーを作成し、3 秒後に閉じようとします:

timer := time.NewTimer(time.Second * 5)
time.Sleep(time.Second * 3)
timer.Stop()
<- timer.C
fmt.Println("定时器已触发!")
ログイン後にコピー

この例では、time.Sleep( ) 関数を使用してメイン タイマーを一時停止します。 3秒間プログラムします。次に、タイマーをオフにして、タイマーが実行されるのを待ちます。ただし、このプログラムは実際にはブロックされ、タイマーの実行結果を待ちます。

これは、タイマーがオフになっても、チャネル C にメッセージが送信されるためです。チャンネル C で待機すると、プログラムはブロックされます。この状況を回避するには、Select ステートメントを使用してタイマーの実行結果を待つことができます。

次のコードは、Select ステートメントを使用してタイマーの実行結果を待つ方法を示しています。

timer := time.NewTimer(time.Second * 5)
time.Sleep(time.Second * 3)
if !timer.Stop() {
    <- timer.C
}
fmt.Println("定时器已关闭!")
ログイン後にコピー

この例では、timer.Stop() 関数を使用して、タイマーの実行結果を待機します。タイマーをオフにします。この関数が false を返した場合、タイマーの実行がまだ完了していないことを意味します。この時点で、プログラムがブロックされないようにチャネル C からメッセージを読み取る必要があります。それ以外の場合は、タイマーがオフになったことを示すテキストを直接出力します。

  1. タイマーの実行は不確実である可能性があります

Select ステートメントを使用してタイマーの実行結果を待つと、タイマーは不明です。つまり、受信したチャネル C メッセージがタイマー トリガー メッセージではない可能性があります。これは、Stop() 関数を使用してタイマーを手動で閉じており、この操作がタイマーの通常の実行を妨げた可能性があるためです。

たとえば、以下のコードは 5 秒のタイマーを作成し、2 秒後にタイマーを閉じようとします。次に、Select ステートメントを使用してタイマーの実行結果を待ちます。

timer := time.NewTimer(time.Second * 5)
time.Sleep(time.Second * 2)
timer.Stop()
select {
    case <- timer.C:
        fmt.Println("定时器已触发!")
    default:
        fmt.Println("定时器已关闭!")
}
ログイン後にコピー

この例では、Select ステートメントを使用してタイマーの実行結果を待ちます。ただし、2 秒後にタイマーを手動でオフにしたため、最終的な出力は「タイマーが作動しました!」ではなく「タイマーがオフになりました!」になる可能性があります。この場合、タイマーの実行結果は不定となります。

この状況を回避するには、タイマーの作成時にタイムスタンプを記録し、タイマーの実行結果が正しいことを確認します。例:

timer := time.NewTimer(time.Second * 5)
start := time.Now()
time.Sleep(time.Second * 2)
timer.Stop()
if time.Since(start) < (time.Second * 5) {
    select {
        case <- timer.C:
            fmt.Println("定时器已触发!")
        default:
            fmt.Println("定时器已关闭!")
    }
}
ログイン後にコピー

この例では、タイマーの作成時に現在のタイムスタンプを記録しました。タイマーをオフにしようとすると、現在の時刻とタイマーによってスケジュールされた時間間隔との差が確認されます。ギャップが 5 秒未満の場合は、タイマーがまだ実行されていないことを意味するので、Select ステートメントを通じてタイマーの実行結果を待つことができます。それ以外の場合は、タイマーがオフになったことを示すテキスト メッセージを直接出力します。

4.概要

Golang のタイマーは、いくつかの反復的なタスクを自動的に実行するのに役立つ非常に実用的な機能です。ただし、リソースの無駄やプログラムのクラッシュを避けるために、タイマーを手動でオフにする方法を学ぶ必要があります。この記事では、Stop() 関数を使用してタイマーをオフにする方法を紹介し、考えられるいくつかの問題と解決策について説明しました。これらのスキルを学んだ後は、Golang のタイマー機能をより適切に使用して、プログラムのパフォーマンスと効率を向上させることができます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート