Golang goroutine和chan 教程01

我加入简书的路程 · · 679 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

goroutine是go语言的精髓,chan是实现goroutine的必要条件

首先我们要清楚的是,区分并发和并行。然后我们再来讨论goroutine对于并发的重要性。看以下代码。

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)
}
函数 执行体
spiner go spiner(100*time.Millisecond)
fib fibN := fib(n)

这里使用了一个go关键字来对spiner函数执行并发。并在main函数执行结束的时候,结束所有函数的运行。这个程序的特点是,有两个独立的func在同时运行。

  • 当Main函数返回,所有的goroutine将暴力终结。(无论你在做什么)
  • goroutine最好要书写成自我生存的形式(自己在main返回之前安全的死亡)

看了这个例子,我们来看一下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 goroutine和chan 教程01

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

679 次点击  
加入收藏 微博
2 回复  |  直到 2019-06-15 14:02:45
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传