一.Go语言为什么运行得快?
原因:
1.多线程,多线程是计算机科学中的一个概念,它指的是在单个进程(程序的执行实例)内同时执行多个线程(执行路径)。每个线程都是程序中的一个独立执行流,可以独立运行,但它们共享同一个进程的资源,如内存空间、文件句柄等。在多线程编程中,一个进程可以包含多个线程,每个线程执行不同的任务,这样可以提高程序的并发性和效率。
2.并发性能提高的的调度模型,Go能最大限度利用资源,充分发挥多核计算机优势,高效运行。
二.实现高并发能力的概念:Goroutine(协程)
2.1 协程概念
Goroutine是Go语言中轻量级的执行单元,可以看作是一种比线程更加轻量级的并发实现。通过使用关键字go,你可以启动一个新的goroutine来执行函数。比如go funName(...),这使得你能够在程序中创建成百上千个,甚至上万个并发执行的任务,而不会消耗过多的系统资源。
使用协程的例子:
图片中他使用go关键字使用了协程,但是go紧跟后面不是调用函数而是定义函数,定义完函数后“}”马上跟上
(i)表示调用函数,使用协程后的输出如下图:
我们可以看到输出的结果不是按照循环的顺序来的,说明Goroutines是并发的,同时进行的。
2.2线程与协程的区别
线程:内核态,线程跑多个协程,栈MB级别。
协程:用户态,轻量级线程,栈KB级别
三.channel——协程与协程之间的桥梁
当我们使用协程时并需要把某数据传给另一个协程,就要使用channel,比如代码
package main
import "fmt"
func main(){
c:=make(chan int)
go func() {
defer fmt.Println("go程结束")
fmt.Println("go正在运行")
c <- 666
}()
num := <-c
fmt.Println("num=",num)
fmt.Println("main go程结束")
}
这里定义了名为c的channel,用来连接函数协程与主协程的管道,函数协程将666写入channel,主协程用num去接收数值,从而实现协程之间的联系。