go语言层面并发什么意思

ZY
ZY 原创
2023-06-13 09:40:54 358浏览

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中文网其它相关文章!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。