go语言层面并发的意思是利用go语言在同一时间段内执行多个任务,Go语言的并发通过goroutine实现,goroutine类似线程,属于用户态的线程,可以根据需要创建成千上万个goroutine并发工作。
本文的操作环境:Windows10系统、go1.20版本、dell g3电脑。
go语言层面并发的意思是利用go语言在同一时间段内执行多个任务。
并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发。
并发与并行
并发:同一时间段内执行多个任务(例如:用微信和两个女朋友聊天)。
并行:同一时刻执行多个任务(例如:你和你的朋友都在用微信和女朋友聊天)。
Go语言的并发通过goroutine实现,goroutine类似线程(线程和进程是操作系统引申出的概念,进程相当于一个大的车间,CPU相当于一个工厂,一个工厂里有很多个车间,进程把工厂分为一个个车间。线程是进程下分的,例如工人和各种在进程上的资源。一个进程里至少有一个线程。),属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时(runtime)调度完成,二线程是由操作系统调度完成。
Go语言还提供channel(通道)在多个goroutine间进行通信。goroutine和channel是Go语言秉承CSP(提倡通过通信共享内存而不是通过共享内存而实现通信)并发模式的重要实现基础
拓展:
goroutine
类似于线程,在语言层面实现,在操作系统的线程上运行。
一个 goroutine 必定对应一个函数,可以创建多个 goroutine 去执行相同的函数。
在 go中使用 goroutine 很方便,在调用函数时在前面加上go关键字,就可以为一个函数创建一个goroutine 。
启动单个goroutine:
package main import ( "fmt" "sync" ) var wg sync.WaitGroup //WaitGroup等待方法 // goroutine demo func hello(i int){ fmt.Println("Hello hello",i) wg.Done() //此方法如果运行 ,通知wg把计数器 -1 } func main() { // 开启一个主goroutine去执行mian函数 wg.Add(10000)//(计数器)只有一个小弟为1,等待wg.Done()后-1,为0时停止等待 for i:=0; i<10000;i++{ //wg.Add(1) 可以给定10000个goroutine 也可以,每次循环+1 go hello(i) // 开启了一个独立的 goroutine去执行hello这个函数 } fmt.Println("Hello main") // 让我们的主goroutine 等待 goroutine 小弟 执行 // 如果不等待,独立的goroutine小弟,可能小弟这个goroutine还没有运行 //time.Sleep(time.Second) 第二种等待 wg.Wait()//等待所有小弟干完活 }
goroutine和线程的区别
OS线程(操作系统线程)一本都有固定的栈内存(通常为2MB),一个goroutine的栈在其生命周期开始时只有很小的栈(典型情况下2KB),goroutine的栈不是固定的,他可以按需增大和缩小,grorutine的栈大小限制可以达到1GB,但极少情况下会到1GB。所以在Go语言中一次创建十万左右的grorutine也是可以的。
以上是go语言层面并发什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!