以下是我看完一些博客文章后的个人见解。。。
golang的一个优势是goroutine,类似一个轻量级的线程。goroutinue机制就像是一个线程池,当一个goroutinue线程被阻塞以后,资源会用来调用另外一个已经准备好的goroutinue线程。goroutinue和channel一起可以很优雅地做到程度的线程同步,以下是goroutinue和channel的简单使用。
例子一:主线程向goroutinue线程发送信息
package main
import(
"fmt"
)
func work(stringChan chan string){
fmt.Println(<-stringChan)
fmt.Println("test")
}
func main() {
stringChan := make(chan string)
go work(stringChan)
stringChan<-"ok"
}
输出结果如下
ok
test
finish
通过关键字go 来调用函数work,传入一个channel的参数stringChan,在work函数中监听stringChan的状态,当在main主线程中往stringChan传入一个字符串时候,work会收到信息,然后fmt.Println(<-stringChan)会输出字符串,然后继续执行。
例子二:goroutine往主线程发送信息
package main
import(
"fmt"
)
func work(stringChan chan string){
stringChan<-"ok"
fmt.Println("test")
}
func main() {
stringChan := make(chan string)
go work(stringChan)
fmt.Println(<-stringChan)
}
输出结果如下
test
ok
在这个例子中,在work函数里面,向stringChan添加字符串,此时并没有立即激活main主线程中的fmt.Println(<-stringChan),而是等work函数执行完了以后才继续main线程,假如在work中的stringChan<-"ok"之后添加一个for死循环的话,运行是没有任何输出的。。
通过goroutine和channel就可以很好的实现多线程和线程同步了。