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

Barbara Streisand
リリース: 2024-10-30 03:40:28
オリジナル
304 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!