TCP Accept and Go の同時実行モデル
質問:
Go の TCPListener はなぜGo が同時実行性を重視していることから予想されるように、チャネルベースのシステムではなく Accept() メソッドをブロックしていますか?
答え:
Go の同時実行モデルはゴルーチン (軽量スレッド) に依存しています。 ) Go ランタイムによって管理されます。 Accept() はブロックしているように見えますが、最終的には Go ランタイムによって管理され、実行するゴルーチンが選択されます。これにより、システム リソースを効率的に使用し、ブロック操作を簡単に実装できます。
カスタム チャネルの実装:
チャネル ベースのシステムを実現するには、ゴルーチンを作成できます。継続的に接続を受け入れ、それらをチャネルにプッシュします。これにより、複数のサーバー ソケットで select() を使用したり、Accept() での待機を他のチャネルで多重化したりする柔軟性が提供されます。
チャネル クロージャの考慮事項:
アクセプターの 1 つでエラーが発生した場合、単にアクセプト チャネルを閉じることはできません。他のアクセプターは、それに書き込もうとするとパニックを起こします。
例:
<code class="go">newConns := make(chan net.Conn) // For every listener, spawn a goroutine that accepts connections for _, l := range listeners { go func(l net.Listener) { for { c, err := l.Accept() if err != nil { // Handle error newConns <- nil return } newConns <- c } }(l) } // Multiplex the channel with a timer for { select { case c := <-newConns: // Handle new connection or nil (if an acceptor is down) case <-time.After(time.Minute): // Timeout branch } }</code>
以上がなぜ同時実行のためにチャネルを使用しないのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。