go之多线程

来源:互联网 发布:全面战争哪代优化最好 编辑:程序博客网 时间:2024/05/21 10:02
在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,取出两次是为了告知主线程两个子线程都运行完毕。




参考:http://www.cnblogs.com/yjf512/archive/2012/06/06/2537712.html

0 0
原创粉丝点击