This commit is contained in:
Xargin 2016-04-27 15:41:19 +08:00
parent ce5648bf33
commit 0e99e1b704
2 changed files with 3 additions and 3 deletions

View File

@ -45,6 +45,6 @@ func fib(x int) int {
Fibonacci(45) = 1134903170
```
然后主函数返回。主函数返回时所有的goroutine都会被直接打断程序退出。除了从主函数退出或者直接终止程序之外没有其它的编程方法能够让一个goroutine来打断另一个的执行但是之后可以看到一种方式来实现这个目的通过goroutine之间的通信来让一个goroutine请求其它的goroutine并被请求的goroutine自行结束执行。
然后主函数返回。主函数返回时所有的goroutine都会被直接打断程序退出。除了从主函数退出或者直接终止程序之外没有其它的编程方法能够让一个goroutine来打断另一个的执行但是之后可以看到一种方式来实现这个目的通过goroutine之间的通信来让一个goroutine请求其它的goroutine被请求的goroutine自行结束执行。
留意一下这里的两个独立的单元是如何进行组合的spinning和菲波那契的计算。分别在独立的函数中但两个函数会同时执行。

View File

@ -1,6 +1,6 @@
## 8.2. 示例: 并发的Clock服务
网络编程是并发大显身手的一个领域,由于服务器是最典型的需要同时处理很多连接的程序,这些连接一般来自彼此独立的客户端。在本小节中我们会讲解go语言的net包这个包提供编写一个网络客户端或者服务器程序的基本组件无论两者间通信是使用TCPUDP或者Unix domain sockets。在第一章中我们已经使用过的net/http包里的方法也算是net包的一部分。
网络编程是并发大显身手的一个领域,由于服务器是最典型的需要同时处理很多连接的程序,这些连接一般来自彼此独立的客户端。在本小节中我们会讲解go语言的net包这个包提供编写一个网络客户端或者服务器程序的基本组件无论两者间通信是使用TCPUDP或者Unix domain sockets。在第一章中我们使用过的net/http包里的方法也算是net包的一部分。
我们的第一个例子是一个顺序执行的时钟服务器,它会每隔一秒钟将当前时间写到客户端:
@ -47,7 +47,7 @@ func handleConn(c net.Conn) {
Listen函数创建了一个net.Listener的对象这个对象会监听一个网络端口上到来的连接在这个例子里我们用的是TCP的localhost:8000端口。listener对象的Accept方法会直接阻塞直到一个新的连接被创建然后会返回一个net.Conn对象来表示这个连接。
handleConn函数会处理一个完整的客户端连接。在一个for死循环中将当前的时候用time.Now()函数得到然后写到客户端。由于net.Conn实现了io.Writer接口我们可以直接向其写入内容。这个死循环会一直执行直到写入失败。最可能的原因是客户端主动断开连接。这种情况下handleConn函数会用defer调用关闭服务器侧的连接然后返回到主函数继续等待下一个连接请求。
handleConn函数会处理一个完整的客户端连接。在一个for死循环中用time.Now()获取当前时刻然后写到客户端。由于net.Conn实现了io.Writer接口我们可以直接向其写入内容。这个死循环会一直执行直到写入失败。最可能的原因是客户端主动断开连接。这种情况下handleConn函数会用defer调用关闭服务器侧的连接然后返回到主函数继续等待下一个连接请求。
time.Time.Format方法提供了一种格式化日期和时间信息的方式。它的参数是一个格式化模板标识如何来格式化时间而这个格式化模板限定为Mon Jan 2 03:04:05PM 2006 UTC-0700。有8个部分(周几,月份,一个月的第几天,等等)。可以以任意的形式来组合前面这个模板出现在模板中的部分会作为参考来对时间格式进行输出。在上面的例子中我们只用到了小时、分钟和秒。time包里定义了很多标准时间格式比如time.RFC1123。在进行格式化的逆向操作time.Parse时也会用到同样的策略。(译注这是go语言和其它语言相比比较奇葩的一个地方。。你需要记住格式化字符串是1月2日下午3点4分5秒零六年UTC-0700而不像其它语言那样Y-m-d H:i:s一样当然了这里可以用1234567的方式来记忆倒是也不麻烦)