Google资深工程师深度讲解Go语言-Goroutine并发编程(九)[通俗易懂]

Google资深工程师深度讲解Go语言-Goroutine并发编程(九)

大家好,又见面了,我是全栈君。

一.协程 coroutine

  • 轻量级”线程“:并发执行一些任务,
  • 非抢占式多任务处理,由协程主动交出控制权:
  • 编译器/解释器/虚拟机层面的多任务
  • 多个协程可能在一个或多个线程上运行:由调度器决定

线程任何时候都可以被操作系统切换,抢占式任务处理,没有控制权,随时被操作系统切换.

执行go文件: go run  goroutine.go   

检测数据访问的冲突  go run -race goroutine.go

Google资深工程师深度讲解Go语言-Goroutine并发编程(九)[通俗易懂]

package main

import (
	"fmt"
	"runtime"
	"time"
)

func main() {
	var sum [10]int
	for i := 0; i < 10; i++ { //1000个并发执行
		go func(ii int) {
			for {
				//fmt.Printf("Hello from goroutine %d \n", a)
				sum[ii]++
				runtime.Gosched() //手动交出控制权
			}
		}(i)
	}
	time.Sleep(time.Microsecond)
	fmt.Println(sum)
}

二.go语言的调度器

python中协程

  • 使用yield关键字实现协程
  • python3.5加入了async def 对协程原生支持

go语言中协程 :

goroutine的定义

  • 任何函数只需要加上go就能送给调度器运行
  • 不需要在定义时区分是否是异步函数
  • 调度器在合适的点进行切换
  • 使用-race来检测数据访问冲突

goroutine可能的切换点

  • I/o,select
  • channel
  • 等待锁
  • 函数调用(有时)
  • runtime.Gosched()
  • 只是参考,不能保证切换,不能保证在其他地方不切换

子程序是协程的一个特例

Google资深工程师深度讲解Go语言-Goroutine并发编程(九)[通俗易懂]

___go_build_ 25.6  00:15.06 8/2 总线程8个,活动线程2个,不会超过电脑物理核数     

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111708.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 广义表中关于tail和head的计算

    广义表中关于tail和head的计算根据表头、表尾的定义可知:任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表,而其表尾必定是子表。也就是说,广义表的head操作,取出的元素是什么,那么结果就是什么。但是tail操作取出的元素外必须加一个表——“ ()“举一个简单的列子:已知广义表LS=((a,b,c),(d,e,f)),如果需要取出这个e这个元素,那么使用tail和head如何将这个取出来。利用上面说的,tai…

    2022年5月4日
    107
  • Spring Boot热部署-spring-boot-devtools

    Spring Boot热部署-spring-boot-devtools

    2021年5月16日
    158
  • Spring框架:Spring容器具体解释[通俗易懂]

    Spring框架:Spring容器具体解释

    2022年2月3日
    57
  • 分治算法详解(超详细)

    分治算法详解(超详细)原分治算法详解

    2025年6月5日
    2
  • memory.h_MemoryMappedFile

    memory.h_MemoryMappedFile(转载)C#使用MemoryStream类读写内存MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法。这两个类都是实现对内存进行数据读写的功能,而不是对持久性存储器进行读写。读写内存-MemoryStream类MemoryStream类用于向内存而不是磁盘读写数据。MemoryStr…

    2025年7月29日
    4
  • Python数据类型有哪些?

    Python数据类型有哪些?数据类型是每种编程语言必备属性,只有给数据赋予明确的数据类型,计算机才能对数据进行处理运算,因此,正确使用数据类型是十分必要的,不同的语言,数据类型类似,但具体表示方法有所不同,以下是Python编程常用的数据类型:1.数字类型Python数字类型主要包括int(整型)、long(长整型)和float(浮点型),但是在Python3中就不再有long类型了。int(整型)在32位…

    2022年6月10日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号