菜鸟笔记
提升您的技术认知

go之多线程

在go里面,并发程序依靠的是goroutine和channel。

goroutine可以理解为线程,当对一个函数调用go,启动一个goroutine的时候,就相当于起来一个线程来执行这个函数。比如:

func getInfo(name string, age int) {
  
    fmt.Printf("name: %s,age: %d \n", name, age)

}

func main() {
  
    go getInfo("li", 12)
    go getInfo("sun", 45)
    fmt.Println("start")
    time.Sleep(1 * 1e10)

}

输出:

start

name: li,age: 12

name: sun,age: 45

当起一个goroutine后,主线程不知道这个goroutine什么时候结束,所以在上面的main函数里设了一个sleep来等待两个goroutine处理完,由此可见,当goroutine结束后必须要通过某种方式来告知主线程自己已经结束。

在go里面则是通过channel来传递这种消息,如:

var c chan int

func getInfo(name string, age int) {
  
    fmt.Printf("name: %s,age: %d \n", name, age)
    c <- 0
}

func main() {
  
    c = make(chan int)
    go getInfo("li", 12)
    go getInfo("sun", 45)
    fmt.Println("start")
    <-c
    <-c

}

channel只能通过make来创建,指定channel的类型(如int)可以说明这个管道能传什么类型的数据。往channel中插入数据用c<-0,取出则是用<-c,取出两次是为了告知主线程两个子线程都运行完毕。