复盘《go程序设计语言》第八章代码170页
package main
import (
"fmt"
"time"
)
func main() {
go spiner(100*time.Millisecond)
const n = 45
fibN := fib(n)
fmt.Printf("\r斐波那契(%d)=%d\n",n,fibN)
}
func spiner(delay time.Duration) {
for {
for _, r := range `-\|/` {
fmt.Printf("\r%c",r)
time.Sleep(delay)
}
}
}
func fib(x int) int {
if x < 2 {
return x
}
return fib(x-1)+fib(x-2)
}
goroutine | 执行体 |
---|---|
main | 主函数 |
spiner | go spiner(100*time.Millisecond) |
fib | fibN := fib(n) |
这里使用了一个go关键字来对spiner函数执行并发。并在main函数执行结束的时候,结束所有函数的运行。这个程序的特点是,有两个独立的func在同时运行。
- 当Main函数返回,所有的goroutine将暴力终结。(无论你在做什么)
- goroutine最好要书写成自我生存的形式(自己在main返回之前安全的死亡)
当main函数返回时,所有的goroutine都暴力地直接终结,然后程序退出。除了从main返回或者退出程序外,没有程序化的方法让一个goroutine来停止另一个。但是向我们看到的那样,有办法和goroutine通信来要求他自己停止。
《Go程序设计语言》第八章171页
看了这个例子,我们来看一下go这个关键字。
在《go程序设计语言》第八章中说道,在go中,每一个并发执行的活动都被称为goroutine,他类似于线程。但是他和线程的数量上有重大差别。更像是一种协程。(关于协程的内容我们会在之后的教程中讲到)
当一个程序启动的时候,只有一个goroutine来调用main函数,他的名字是主gouroutine。新的goroutine由go关键字创建,就是普通的函数加上go前缀。go语句本身的执行立即完成。剩下的都交给了并发的goroutine来决定的执行。
接下来讨论本章涉及到的代码:
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64
time包中的Duration类型 实际上是int64,表示的是时间。最大的值是290年。
// Sleep pauses the current goroutine for at least the duration d.
// A negative or zero duration causes Sleep to return immediately.
func Sleep(d Duration)
一个睡眠函数,睡眠的时间是duration参数
总而言之这个小案例的代码还是比较简单滴。
网友评论