Goroutines
在go语言中,每一个并发执行的单元都叫做goroutine,类似其他语言中并发执行的最小单位——线程,它与线程的区别将在本文后面进行解释。
当一个程序启动时,其主函数即在一个单独的goroutine中运行,我们叫它main goroutine。新的goroutine会用go语句来创建。在语法上,go语句是一个普通的函数或方法调用前加上关键字go。go语句会使其语句中的函数在一个新创建的goroutine中运行。而go语句本身会迅速地完成。
主函数返回时,所有的goroutine都会被直接打断,程序退出。除了从主函数退出或者直接终止程序之外,没有其它的编程方法能够让一个goroutine来打断另一个的执行,但是之后可以看到一种方式来实现这个目的,通过goroutine之间的通信来让一个goroutine请求其它的goroutine,并让被请求的goroutine自行结束执行。
并发clock测试
这里实现一个顺序执行的时钟服务器,它会每隔一秒钟将当前时间写到客户端:
func testClock() {
listener,err := net.Listen("tcp","localhost:8080")
if err != nil {
log.Fatal(err)
}
for {
conn,err := listener.Accept()
if err != nil {
log.Fatal(err)
continue
}
handleConn(conn)
}
}
func handleConn(c net.Conn) {
defer c.Close()
for {
_,err := io.WriteString(c,time.Now().Format("15: