要知道的是golang使用goroutine实现并发,goroutine只是官方实现的超级“线程池”,每个实例4-5kb的栈内存占用,由于事先机制而大幅减少的创建和呃呃销毁开销,是制造go号称的高并发的根本原因。
并发不是并行,并发主要是由切片来实现“同时”运行,而并行是直接利多核实现多线程的运行,但go可以设置使用核数,以发挥多核计算机的能力,某种意义上来说,并优于并行。
Goroutine奉行的是通过共享同行来共享内存,而不是共享内存来通信。
例子:在mian方法中开一个goroutine。
go func() {
fmt.Print("by goroutine")
}()
运行之后你会发现,没有输出内容,这是为什么呢?如果使用单线程的思想,这是走完gorotine,在退出main方法的,但在并发中,main程序没有等待goroutine的完成,main方法就直接退出了。
这时候需要一个channel与goroutine就行沟通。
func main() {
c := make(chan bool)
go func() {
fmt.Print("go go go")
c<-false
}()
<-c
}
在无缓存的channel中,需要先读取,后存数据,程序就会等待存了之后再退出。
func main() {
c := make(chan bool)
go func() {
fmt.Print("go go go")
c<-false
close(c)
}()
for v:=range c {
fmt.Println(v)
}
}
网友评论