TCP Accept 和Go 的並發模型
問題:
問題:ener'一個阻塞Accept() 方法而不是基於通道的系統,正如Go 所強調的並發?
答案:Go 的並發模型依賴 Go 運行時管理的 goroutine(輕量級執行緒)。雖然 Accept() 可能會出現阻塞,但它最終由 Go 運行時管理,它選擇 goroutine 來執行。這樣可以有效利用系統資源並輕鬆實現阻塞操作。
自訂通道實作:要實現基於通道的系統,可以建立一個 goroutine它不斷接受連接並將它們推送到通道上。這提供了將 select() 與多個伺服器套接字一起使用或將 Accept() 上的等待與其他通道重複使用的靈活性。
通道關閉注意事項:請注意,如果您的接受者之一遇到錯誤,您不能簡單地關閉接受通道。其他接受者在嘗試寫入時會出現恐慌。
<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>範例:
以上是為什麼 Go 的 TCPListener 不使用通道來實現並發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!