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 読み取りがブロックされる可能性がありますが、これは推奨されるアプローチではないことに注意してください。操作をブロックすると、パフォーマンスの問題やデッドロック状況が発生する可能性があります。代わりに、一般に、次のような代替アプローチを使用することをお勧めします。
結論
Go では TCP 読み取りブロックを行うことは可能ですが、はお勧めしません。代わりに、io.Reader、context.Context、または goroutines などの代替アプローチを使用して、ブロック動作をより効率的に処理することを検討してください。
以上がGo TCP 読み取りをブロッキングにできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。