并发主要是由切换时间片来实现“同时”运行,并行则是直接利用多核实现多线程的运行,但GO可以设置使用的核数,以发挥计算机的能力,称为高并发。Goroutine即是官方实现的超级“线程池”。他的通信模型,是以消息机制而非共享内存作为方式来进行。消息机制认为每个并发单元是自包含的、独立的个体,并且都有自己的变量,但在不同并发单元间这些变量不共享。每个并发单元的输入和输出只有一种,那就是消息。这有点类似于进程的概念,每个进程不会被其他进程打扰,它只做好自己的工作就可以了。不同进程间靠消息来通信,它们不会共享内存。即著名的口号:“不要通过共享内存来通信,而应该通过通信来共享内存。”
Go语言提供的消息通信机制被称为channel,我们可以使用channel在两个或多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。
实例演示(例子中含有匿名函数的使用):
1 package main
2 import "fmt"
3 func main() {
4 c := make(chan bool)
5 go func() {
6 fmt.Println("您好,欢迎测试Goroutine")
7 c
8 }()
9
10 }
这是一个很简单的实例,执行过程如下:
当主程序运行到第5行时,并发执行匿名函数go func()。
此时主程序并未停止,执行到第9行时,会等待go func()中的传回的信息,即c值
当并发程序go func()执行完毕时,发送信息,将TRUE值传递给通道;
当通道收到信息后,传回到第9行。主程序:好,收到信息。继续运行,读取通道信息,结束程序。
程序及运行结果:
go 并发
【分享成果,随喜真能量】
领取专属 10元无门槛券
私享最新 技术干货