From 3f79917bd7c70b593b055237d707c6b008d8e0e2 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Tue, 29 Dec 2015 16:15:56 +0800 Subject: [PATCH] make loop --- ch8/ch8-03.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ch8/ch8-03.md b/ch8/ch8-03.md index 3ea9242..3005974 100644 --- a/ch8/ch8-03.md +++ b/ch8/ch8-03.md @@ -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中的方法在併發地調用時是否安全,事實上對於大多數類型來説也確實不安全。我們會在下一章中詳細地探討併發安全性。