goroutine(协程)

52 阅读1分钟

这部分,等我全部梳理完成后再回来完善

学了一年408,现在又看到了你们

进程

线程

Go协程和Go主线程 Go主线程(有程序员直接称为线程/也可以理解为进程):一个Go线程上,可以创建多个协程。

Go协程的特点

  • 有独立的栈空间
  • 共享程序堆空间
  • 调度由用户控制
  • 协程是轻量级线程

Goroutine是与其他函数或方法同时运行的函数或方法。Goroutines可以被认为是轻量级的线程。与线程相比,创建Goroutine的成本很小,它就是一段代码,一个函数入口。以及在堆上为其分配的一个堆栈(初始大小为4K,会随着程序的执行自动增长删除)。因此它非常廉价,Go应用程序可以并发运行数千个Goroutines。大多数Golang程序同时使用数千个Goroutine

goroutine的使用方式

在函数或方法调用前面加上关键字go

案例

package main

import (
   "fmt"
   "time"
)

func odd() {
   for i := 0; i < 100; i++ {
      fmt.Println("odd: ", i)
      time.Sleep(1 * time.Second)
   }
}

func even() {
   for i := 0; i < 100; i++ {
      fmt.Println("even: ", i)
      time.Sleep(1 * time.Second)
   }
}

func main() {
   go odd()
   go even()
   for i := 0; i < 100; i++ {
      fmt.Println("main: ", i)
      time.Sleep(1 * time.Second)
   }
}

增加睡眠函数可以更加直观的感受到并发的效果 image.png

停止一个协程

通过向Goroutine发送一个信号通道来停止它。Goroutines只能在被告知检查时响应信号,因此需要在逻辑位置上包含检查

package main

import (
   "fmt"
)

func main() {
    quit := make(chan bool)
    go func(){
        for {
            select {
                case <-quit:
                    return
                default:
                    //
            }
        }
    }()
    
    quit <- true
}