make loop

This commit is contained in:
chai2010
2015-12-29 16:15:56 +08:00
parent 79cf66dded
commit 3f79917bd7

View File

@@ -1,6 +1,6 @@
## 8.3. 示例: 併發的Echo服務
clock服器每一个连接都起一goroutine。在本中我们会创建一echo服器,这个服务在每个连接中有多goroutine。大多echo服务仅仅会返回他们读取到的容,就像下面这个简单的handleConn函所做的一
clock服器每一個連接都起一goroutine。在本中我們會創建一echo服器,這個服務在每個連接中有多goroutine。大多echo服務僅僅會返迴他們讀取到的容,就像下面這個簡單的handleConn函所做的一
```go
func handleConn(c net.Conn) {
@@ -8,7 +8,7 @@ func handleConn(c net.Conn) {
c.Close()
}
```
更有意思的echo服务应该模拟一个实际的echo的“回响”,且一始要用大HELLO表示“音很大”,之后经过一小段延迟返回一个有所和的Hello后一个全小字母的hello表示声音渐渐变小直至消失,像下面这个版本的handleConn(译注:笑看作者洞大)
更有意思的echo服務應該模擬一個實際的echo的“迴響”,且一始要用大HELLO表示“音很大”,之後經過一小段延遲返迴一個有所和的Hello後一個全小字母的hello表示聲音漸漸變小直至消失,像下面這個版本的handleConn(譯註:笑看作者洞大)
```go
gopl.io/ch8/reverb1
@@ -30,7 +30,7 @@ func handleConn(c net.Conn) {
}
```
需要升级我们的客端程序,这样它就可以发送终端的入到服器,把服端的返回输出到端上,使我有了使用并发的另一个好机会
需要陞級我們的客端程序,這樣它就可以發送終端的入到服器,把服端的返迴輸出到端上,使我有了使用併發的另一個好機會
```go
gopl.io/ch8/netcat2
@@ -45,10 +45,10 @@ func main() {
}
```
main goroutine从标准输入流中读取内容并将其发送给服务器时,另一goroutine会读取并打印服端的响应。当main goroutine碰到输入终止时,例如,用户在终端中按了Control-D(^D)在windows上是Control-Z这时程序就会被终止,管其它goroutine中还有进行中的任。(在8.4.1中引入了channels后我们会明白如何程序等待两边都结束)。
main goroutine從標準輸入流中讀取內容併將其發送給服務器時,另一goroutine會讀取併打印服端的響應。當main goroutine碰到輸入終止時,例如,用戶在終端中按了Control-D(^D)在windows上是Control-Z這時程序就會被終止,管其它goroutine中還有進行中的任。(在8.4.1中引入了channels後我們會明白如何程序等待兩邊都結束)。
下面这个会话中,客端的入是左对齐的,服端的响应会用缩进来区别显示。
户端会向服器“喊三次”:
下面這個會話中,客端的入是左對齊的,服端的響應會用縮進來區别顯示。
戶端會向服器“喊三次”:
```
$ go build gopl.io/ch8/reverb1
@@ -71,7 +71,7 @@ yooo-hooo!
$ killall reverb1
```
意客端的第三次shout在前一shout理完成之前一直有被理,貌似看起不是特别“现实”。真实世界里的回响应该是会由三次shout的回声组合而成的。了模拟真实世界的回响,我需要更多的goroutine来做这件事情。这样我们就再一次地需要go这个关键词了,次我用它来调用echo
意客端的第三次shout在前一shout理完成之前一直有被理,貌似看起不是特别“現實”。眞實世界里的迴響應該是會由三次shout的迴聲組合而成的。了模擬眞實世界的迴響,我需要更多的goroutine來做這件事情。這樣我們就再一次地需要go這個關鍵詞了,次我用它來調用echo
```go
gopl.io/ch8/reverb2
@@ -85,8 +85,8 @@ func handleConn(c net.Conn) {
}
```
go跟的函数的参数会在go句自身执行时被求值因此input.Text()在main goroutine中被求值。
现在回响是并发并且会按时间来覆盖掉其它响应了:
go跟的函數的參數會在go句自身執行時被求值因此input.Text()在main goroutine中被求值。
現在迴響是併發併且會按時間來覆蓋掉其它響應了:
```
$ go build gopl.io/ch8/reverb2
@@ -104,4 +104,4 @@ Yooo-hooo!
$ killall reverb2
```
让服务使用并发不只是处理多个客户端的求,甚至在处理单个连接时也可能用到,就像我上面的两个go关键词的用法。然而在我使用go关键词的同,需要慎重地考net.Conn中的方法在并发地调用时是否安全,事实上对于大多数类型来说也确实不安全。我们会在下一章中详细地探讨并发安全性。
讓服務使用併發不隻是處理多個客戶端的求,甚至在處理單個連接時也可能用到,就像我上面的兩個go關鍵詞的用法。然而在我使用go關鍵詞的同,需要慎重地考net.Conn中的方法在併發地調用時是否安全,事實上對於大多數類型來説也確實不安全。我們會在下一章中詳細地探討併發安全性。