Golang之goroutine

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang之goroutine相关的知识,希望对你有一定的参考价值。

参考技术A

阅读前提:基本了解进程与线程定义与区别

我们知道 程序的运行顺序是根据指令语句的顺序来执行的 当我这样执行时

假设这两个函数没有调用其他函数 只是简单的输出 (fun1输出1-5 fun2输出6-10) 那么程序执行时先执行fun1函数 执行完毕后再执行fun2函数 这是毋庸置疑的

但是当我们通过创建协程来实现这两个函数时

此时 终端输出并不是输出1-10的顺序序列 而是这两个协程在同一个时间片内共同运行 简称 并行
!这里我用了time包中的Sleep 因为我这里的输出数太少 所以它一开始输出的时候还是顺序执行 体现不出来协程的特点

golang之goroutine和channel

多线程程序在单核上运行,就是并发

多线程程序在多核上运行,不是并行

Go协程和Go主线程

  Go主线程(线程):一个Go线程上,可以起多个协程 ,你可以这样理解,协程是轻量级的线程

  Go协程的特点:

    1)有独立的栈空间

    2)共享程序堆空间

    3) 调度由用户控制

    4)协程是轻量级的线程3

goroutine快速入门

func test() {
    for i := 1; i <= 10; i++ {
        fmt.Println("test() hello, world " + strconv.Itoa(i))
        time.Sleep(time.Second)
    }
}

func main() {
    go test()

    for i := 1; i <= 10; i++ {
        fmt.Println("main() hello, world " + strconv.Itoa(i))
        time.Sleep(time.Second)
    }
}

  小结:

    1)主线程是一个物理线程,直接作用在cpu上的,是重量级的,非常耗费cpu资源;

    2)协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小;

    3)Golang的协程机制是重要的特点,可以轻松的开启上万个协程。其它编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这里就突显Golang在并发上的优势了。

MPG模式基本介绍

  1)M:操作系统的主线程(是物理线程)

  2)P:协程执行需要的上下文

  3)G:协程

设置运行的cpu数目:

func main() {
    cupNum := runtime.NumCPU()
    fmt.Println(cupNum)

    // 设置运行的cpu数目
    runtime.GOMAXPROCS(cupNum)
}

 

以上是关于Golang之goroutine的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Golang中的Context包

Golang 基础:原生并发 goroutine channel 和 select 常见使用场景

Golang 基础:原生并发 goroutine channel 和 select 常见使用场景

Golang 学习之路

golang开发效率小技巧之gopatch

Go语言学习之旅--并发编程