教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言学习笔记七(协程)

Go语言学习笔记七(协程)

发布时间:2022-12-18   编辑:jiaochengji.com
教程集为您提供Go语言学习笔记七(协程)等资源,欢迎您收藏本站,我们将为您提供最新的Go语言学习笔记七(协程)资源

协程机制

Golang 线程和协程的区别

备注:需要区分进程、线程(内核级线程)、协程(用户级线程)三个概念。

进程、线程 和 协程 之间概念的区别

对于进程、线程,都是有内核进行调度,有CPU时间片的概念,进行抢占式调度(有多种调度算法)

对于协程(用户级线程),这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的,因为是由用户程序自己控制,那么就很难像抢占式调度那样做到强制的 CPU 控制权切换到其他进程/线程,通常只能进行协作式调度,需要协程自己主动把控制权转让出去之后,其他协程才能被执行到。

goroutine 和协程区别

本质上,goroutine 就是协程。 不同的是,Golang 在 runtime、系统调用等多方面对 goroutine 调度进行了封装和处理,当遇到长时间执行或者进行系统调用时,会主动把当前 goroutine 的CPU (P) 转让出去,让其他 goroutine 能被调度并执行,也就是 Golang 从语言层面支持了协程。Golang 的一大特色就是从语言层面原生支持协程,在函数或者方法前面加 go关键字就可创建一个协程。

func TestGroutine(t *testing.T) {
    for i := 0; i < 10; i   {
        go func(i int) {
            fmt.Println(i)
        }(i)
    }
    time.Sleep(time.Millisecond * 50)
}

这里面额外在内部func里传了i,注意这里如果不传i,直接用的话是不可行的,因为使用go创建协程,但是需要注意的是:协程函数的par作为参数是外部i的数据拷贝。

其他方面的比较
  1. 内存消耗方面
  • 每个 goroutine (协程) 默认占用内存远比 Java 、C 的线程少。
    goroutine:2KB
    线程:8MB
  1. 线程和 goroutine 切换调度开销方面
  • 线程/goroutine 切换开销方面,goroutine 远比线程小
  • 线程:涉及模式切换(从用户态切换到内核态)、16个寄存器、PC、SP...等寄存器的刷新等。
  • goroutine:只有三个寄存器的值修改 - PC / SP / DX.

参考

Golang 之协程详解


到此这篇关于“Go语言学习笔记七(协程)”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
go html提取纯文本_Go 语言高性能编程
Golang笔记:语法,并发思想,web开发,Go微服务相关
Go 语言数据类型:byte、rune与字符串
go run main.go 参数_Go语言入门:Hello world
Golang学习笔记(五):Go语言与C语言的区别
go语言学习笔记(第3章)—面向对象编程
Go语言发展历史、核心、特性及学习路线
Go 语言十年而立,Go2 蓄势待发
go 语言学习历程

[关闭]
~ ~