ホームページ  >  記事  >  バックエンド開発  >  効率的なスリープベースのアプローチを使用して Go で「tail -f」ジェネレーターを構築する方法

効率的なスリープベースのアプローチを使用して Go で「tail -f」ジェネレーターを構築する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 03:40:28293ブラウズ

How to Build a

Go での "tail -f" のようなジェネレーター

この記事では、Go での "tail -f" のようなジェネレーターの作成について説明します。 Go。ファイルの最後の行をリアルタイムで監視できます。最初の Go 実装には、ファイルから継続的に読み取るゴルーチンによる非同期呼び出しが含まれていました。ただし、EOF でスリープするリーダーの周囲にラッパーを使用する、より慣用的なアプローチをお勧めします。

実装の改善:

提案された改善には、以下を実装する tailReader 構造体の作成が含まれます。 io.ReadCloser インターフェイス。このリーダーは EOF に遭遇するとスリープし、継続的なポーリングを行わずに継続的なモニタリングを可能にします。

<code class="go">type tailReader struct {
    io.ReadCloser
}

func (t tailReader) Read(b []byte) (int, error) {
    for {
        n, err := t.ReadCloser.Read(b)
        if n > 0 {
            return n, nil
        } else if err != io.EOF {
            return n, err
        }
        time.Sleep(10 * time.Millisecond)
    }
}</code>

tailReader を作成するには、newTailReader(fileName) を使用します。このリーダーは、bufio.Scanner や json.NewDecoder などの io.Reader を受け入れる任意のプロバイダーで使用できます。

利点:

このメソッドにはいくつかの利点があります。 goroutine アプローチより:

  • 簡単なシャットダウン: ファイルを閉じるだけで操作を終了できます。
  • 互換性: リーダーはio.Reader をサポートする多くの既存のパッケージとシームレスに統合されています。
  • 調整可能なスリープ時間: スリープ遅延は、パフォーマンス要件と遅延許容度に基づいて最適化できます。

以上が効率的なスリープベースのアプローチを使用して Go で「tail -f」ジェネレーターを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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