Go でのブロッキング TCP 読み取りと非ブロッキング TCP 読み取り
Go で TCP 接続を操作する場合、通常、読み取り操作は非ブロッキングです。これは、データがまだ利用できない場合でも、Read 関数はすぐに戻ることを意味します。ただし、場合によっては、データを受信するまで待機するブロッキング読み取り操作が望ましい場合があります。
Go でブロッキング読み取りを有効にすることは可能ですか?
組み込みの Read 関数はノンブロッキングですが、Go は読み取りをブロッキングする直接的な方法を提供しません。ただし、ブロック動作をシミュレートできるメソッドがいくつかあります。
シミュレートされたブロッキングのコード例
次は例です。ループを使用したブロッキング読み取りのシミュレーション:
<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 サイトの他の関連記事を参照してください。