ホームページ  >  記事  >  バックエンド開発  >  Go で TCP 読み取りのブロックを実現するにはどうすればよいですか?

Go で TCP 読み取りのブロックを実現するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-03 01:29:30963ブラウズ

How can I achieve blocking TCP reads in Go?

Go でのブロッキング TCP 読み取りと非ブロッキング TCP 読み取り

Go で TCP 接続を操作する場合、通常、読み取り操作は非ブロッキングです。これは、データがまだ利用できない場合でも、Read 関数はすぐに戻ることを意味します。ただし、場合によっては、データを受信するまで待機するブロッキング読み取り操作が望ましい場合があります。

Go でブロッキング読み取りを有効にすることは可能ですか?

組み込みの Read 関数はノンブロッキングですが、Go は読み取りをブロッキングする直接的な方法を提供しません。ただし、ブロック動作をシミュレートできるメソッドがいくつかあります。

  • io.ReadAtLeast() の使用: この関数は、指定されたバイト数が読み取られるまでブロックします。ただし、予想よりも多くのデータが到着した場合、信頼性が低くなる可能性があります。
  • ループでの読み取り: ブロッキング読み取りをシミュレートする簡単な方法は、データが受信されるまでループ内で Read 関数を繰り返し呼び出すことです。利用可能。この方法は信頼性が高くなりますが、追加の CPU リソースを消費する可能性があります。
  • チャネルの使用: 別のオプションは、データをバッファリングするためにチャネルを使用することです。クライアントはデータをチャネルに送信し、サーバーが受信するまでブロックします。

シミュレートされたブロッキングのコード例

次は例です。ループを使用したブロッキング読み取りのシミュレーション:

<code class="go">func init_tcp() *net.TCPListener {
    laddr, err := net.ResolveTCPAddr("tcp", ":4243")
    if err != nil {
            log.Fatal(err)
    }
    tcp, err := net.ListenTCP("tcp", laddr)
    if err != nil {
            log.Fatal(err)
    }
    return tcp
}

func main() {
    tcp := init_tcp()
    conn, _ := tcp.Accept()
    data := make([]byte, 512)
    conn.SetNoDelay(false)
    for {
            // Repeat Read() until data is available
            for len(data) == 0 {
                    conn.Read(data)
            }
            fmt.Println(data)
            // Reset data for next iteration
            data = make([]byte, 512)
    }
}</code>

結論

Go の TCP 読み取りはデフォルトでは非ブロッキングですが、さまざまな方法を使用してブロッキング動作をシミュレートすることができます。テクニック。最適なアプローチは、アプリケーションの特定の要件によって異なります。シミュレートされたブロッキングにより追加のオーバーヘッドや複雑さが生じる可能性があるため、慎重に使用する必要があることに留意してください。

以上がGo で TCP 読み取りのブロックを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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