ホームページ > バックエンド開発 > Golang > Go TCP 読み取りをブロッキングにできますか?

Go TCP 読み取りをブロッキングにできますか?

Barbara Streisand
リリース: 2024-11-03 00:33:29
オリジナル
348 人が閲覧しました

Can Go TCP Reads Be Made Blocking?

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

Go では、TCP 読み取りはデフォルトでノンブロッキングです。これは、読み取り可能なデータがない場合でも、conn.Read() 関数はすぐに返されることを意味します。この動作は、クライアントからの特定の応答を待機している場合など、特定の使用例では問題になる可能性があります。

Can Go TCP Reads Be Blocking?

When Go TCPデフォルトでは読み取りは非ブロッキングですが、ブロックにすることも可能です。これは、sync.Mutex タイプを使用して接続へのアクセスを同期することで実現できます。

次に、Mutex を使用して読み取り操作をブロックするサーバー コードの修正バージョンを示します。

<code class="go">import (
    "fmt"
    "log"
    "net"
    "sync"
)

func main() {
    tcp := Init_tcp()
    conn, _ := tcp.Accept()
    data := make([]byte, 512)
    var m sync.Mutex

    for {
        m.Lock()
        conn.Read(data)
        m.Unlock()
        fmt.Println(data)
    }
}</code>
ログイン後にコピー

この例では、sync.Mutex により、一度に 1 つの goroutine だけが接続にアクセスできることが保証されます。これにより、接続から同時に読み取られる複数の goroutine によってデータが破損するのを防ぎます。

読み取りブロックの代替手段

ミューテックスを使用すると TCP 読み取りがブロックされる可能性がありますが、これは推奨されるアプローチではないことに注意してください。操作をブロックすると、パフォーマンスの問題やデッドロック状況が発生する可能性があります。代わりに、一般に、次のような代替アプローチを使用することをお勧めします。

  • io.Reader の使用: io.Reader インターフェイスは、ブロッキング読み取り操作を提供します。 TCP 接続を io.Reader でラップすると、ブロック的な方法で接続から読み取ることができます。
  • context.Context の使用: context.Context タイプを使用して指定できます。読み取り操作のタイムアウト。タイムアウトが経過すると、読み取り操作はエラーを返します。
  • ゴルーチンの使用: 別のゴルーチンを使用して、TCP 接続からの読み取りを処理できます。これにより、ブロック動作を制御し、メイン スレッドのブロックを回避できます。

結論

Go では TCP 読み取りブロックを行うことは可能ですが、はお勧めしません。代わりに、io.Reader、context.Context、または goroutines などの代替アプローチを使用して、ブロック動作をより効率的に処理することを検討してください。

以上がGo TCP 読み取りをブロッキングにできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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