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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于0xffffffff 到底是什么意思?

    关于0xffffffff 到底是什么意思?0x16进制一个f代表4个1, 所以就是2进制的32个1.但是运行一下下面这个代码就会发现输出的是-1#includeusingnamespacestd;intmain(){inti=0xffffffff;cout<

    2022年5月17日
    180
  • 软考网络工程师备考经验

    软考网络工程师备考经验软考网工的备考经验文章目录讲废话题型备考经验上午题下午题刷题软件讲废话本人大三,网络工程专业。11月8日考的试,11月18日出的成绩。上午53,下午54,但是成绩还是让我不太满意鸭!!!最开始大二的时候从老师的嘴里听到的有能力的去考软考(其实我也没什么能力,是个老菜逼了。。。)所以下课的时候就了解了一下。软考有初级、中级、高级。初级是网管员没什么技术含量挺简单的,高级呢,要写论文还没项目经验也不会写论文,所以就选择了中级网络工程师。题型分为上午题(75道选择题)、下午题(案例分析4大题7

    2022年5月28日
    38
  • 从零开始学Android_数学从零开始要学多久

    从零开始学Android_数学从零开始要学多久1环境搭建如果可以翻墙,环境搭建不是什么大问题,如果不能翻墙,则搭建环境比较困难。首先,我们根据网上的教程安装JDK。然后安装Androidstudio,最后进行一些配置,具体可以参考如下链接:https://jingyan.baidu.com/article/36d6ed1f9031bc1bcf4883f7.html。如果是国内环境,需要配置相关的国内镜像和仓库。有条件的话还是选择VPN的方…

    2022年4月20日
    45
  • map怎么转json对象_json怎么获取map

    map怎么转json对象_json怎么获取map如何把JSON对象转为map对象呢?JSON对象保存在大括号内。就像在JavaScript中,对象可以保存多个键/值对。Map对象保存键/值对,是键/值对的集合。任何值(对象或者原始值)都可以作为一个键或一个值。Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。javascript将JSON对象转为map对象可以利用阿里巴巴封装的FastJSON来转换。有多种…

    2022年8月23日
    7
  • mysql将yyyy转换_Mysql时间格式转换

    mysql将yyyy转换_Mysql时间格式转换对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6日期和时间类型。这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:mysql>SELECTsomethingFROMtableWHERETO_DAYS(NOW())-TO_DAYS(date_col)<=30;DAYOFWEEK(date)返回…

    2022年6月19日
    48
  • NumPy 文件存取 tofile,fromfile, load,save

    NumPy 文件存取 tofile,fromfile, load,save

    2020年11月8日
    194

发表回复

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

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