golang之goroutine和channel

Posted xiangxiaolin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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和channel的主要内容,如果未能解决你的问题,请参考以下文章

golang并发编程之channel

golang 碎片整理之 并发

Golang channel 用法与实现原理

golang 使用goroutines和channel异步获取url

golang的goroutine与channel

Golang中goroutine和channel