美文网首页Go语言实践
Golang高并发教程之 复盘《go程序设计语言》第八章代码17

Golang高并发教程之 复盘《go程序设计语言》第八章代码17

作者: 我加入简书的路程 | 来源:发表于2019-06-15 10:48 被阅读0次

    复盘《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参数

    总而言之这个小案例的代码还是比较简单滴。

    相关文章

      网友评论

        本文标题:Golang高并发教程之 复盘《go程序设计语言》第八章代码17

        本文链接:https://www.haomeiwen.com/subject/giwmfctx.html