mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-08-15 02:51:34 +00:00
fmr code
This commit is contained in:
@@ -24,7 +24,6 @@ func main() {
|
||||
|
||||
然後是broadcaster的goroutine。他的內部變量clients會記録當前建立連接的客戶端集合。其記録的內容是每一個客戶端的消息發出channel的"資格"信息。
|
||||
|
||||
|
||||
```go
|
||||
type client chan<- string // an outgoing message channel
|
||||
|
||||
@@ -90,6 +89,7 @@ func clientWriter(conn net.Conn, ch <-chan string) {
|
||||
另外,handleConn爲每一個客戶端創建了一個clientWriter的goroutine來接收向客戶端發出消息channel中發送的廣播消息,併將它們寫入到客戶端的網絡連接。客戶端的讀取方循環會在broadcaster接收到leaving通知併關閉了channel後終止。
|
||||
|
||||
下面演示的是當服務器有兩個活動的客戶端連接,併且在兩個窗口中運行的情況,使用netcat來聊天:
|
||||
|
||||
```
|
||||
$ go build gopl.io/ch8/chat
|
||||
$ go build gopl.io/ch8/netcat3
|
||||
@@ -110,7 +110,6 @@ You are 127.0.0.1:64216 127.0.0.1:64216 has arrived
|
||||
127.0.0.1:64211: Welcome. 127.0.0.1:64211: Welcome.
|
||||
^C
|
||||
127.0.0.1:64211 has left”
|
||||
|
||||
```
|
||||
|
||||
當與n個客戶端保持聊天session時,這個程序會有2n+2個併發的goroutine,然而這個程序卻併不需要顯式的鎖(§9.2)。clients這個map被限製在了一個獨立的goroutine中,broadcaster,所以它不能被併發地訪問。多個goroutine共享的變量隻有這些channel和net.Conn的實例,兩個東西都是併發安全的。我們會在下一章中更多地解決約束,併發安全以及goroutine中共享變量的含義。
|
||||
|
Reference in New Issue
Block a user