goroutine

定义

在go里面,每一个并发执行的活动成为goroutine。

详解:goroutine可以认为是轻量级的线程,与创建线程相比,创建成本和开销都很小,每个goroutine的堆栈只有几kb,并且堆栈可根据程序的需要增长和缩小(线程的堆栈需指明和固定),所以go程序从语言层面支持了高并发。

程序执行的背后:当一个程序启动的时候,只有一个goroutine来调用main函数,称它为主goroutine,新的goroutine通过go语句进行创建。

单个goroutine创建

在函数或者方法前面加上关键字go,即创建一个并发运行的新goroutine。

示例如下:

package main
import (
    "fmt"
    "time"
)
func HelloWorld() {
    fmt.Println("Hello world goroutine")
}
func main() {
    go HelloWorld()      // 开启一个新的并发运行
    time.Sleep(1*time.Second)
    fmt.Println("我后面才输出来")
}

执行结果:

Hello world goroutine
我后面才输出来

多个goroutine创建

示例:

package main

import (
    "fmt"
    "time"
)

func main()  {
    go DelayPrint()
    go helloworld()
    time.Sleep(10*time.Second)
    fmt.Println("aaa")
}

func helloworld(){
    fmt.Println("hello goroutine")
}

func DelayPrint(){
    for i := 1; i <= 4; i++ {
        time.Sleep(5*time.Second)
        fmt.Println(i)
    }
}

输出结果:

hello goroutine
1
aaa

结论:

1.当main函数返回时,所有的gourutine都是暴力终结的,然后程序退出

2.当程序执行go FUNC()的时候,只是简单的调用然后就立即返回了,并不关心函数里头发生的故事情节,所以不同的goroutine直接不影响,main会继续按顺序执行语句

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!