1.Gorontine和Channel
来源:互联网 发布:淘宝店铺可以买卖吗 编辑:程序博客网 时间:2024/05/01 23:45
1.通过代码分析golang语言的执行流程
代码A:func main() { //并发执行下面这个方法 go println("Go! Goroutine!") /* 1.函数time.Sleep()的作用是让调用它的Goroutine暂停(进入Gwaiting状态)一段时间 这里让main函数所在的Goroutine暂停了1毫秒 2.在理想情况下,运行该源码文件会如我们所愿地在标准输出上打印出Go!Goroutine 3.情况并不是总是这样的,调度器的实时调度是我们无法控制的,所以上面这个策略是非常不保险的 4.Go语言还有一个函数runtime.Gosched()替换对time.Sleep()函数的调用是一种更保险的方式 5.runtime.Gosched()函数的作用是让其他Goroutine有机会被运行,但是在实际情况下这个方法也无法保证 */ time.Sleep(time.Millisecond)}上面的代码可能会输出Go! Goroutine!,可能什么都没输出。但是测试很难发现没输出这个打印的。代码B:func main() { //定义一个变量并初始化为ABCD name := "ABCD" //启动一个协程去处理里面的方法,把它丢入到执行队列中 go func() { fmt.Printf("Hello,%s.\n",name) }() //继续修改name的值 name = "XYZ" //调用下面的方法让上面的协程方法能够得到执行,但是运行了几次没有打印输出内容,这个跟上面的调度机制是一样的。 runtime.Gosched()//调用下面函数让主Goroutine进入Gwaiting状态,然后让前面的协程去执行,测试发现加了这延迟,协程一般会得到执行,但是不能保证。 time.Sleep(time.Millisecond*5)代码C:func main() { names :=[]string{"A","B","C","D","E","F"} for _,name := range names{ go func() { fmt.Printf("Hello,%s.\n",name) }() } runtime.Gosched()//第一次执行的结果如下Hello,F.Hello,B.Hello,E.Hello,F.Hello,F.Hello,F.//第二次输只有下面几行,第三次一个也没输出Hello,F.Hello,F.//从代码执行的结果来分析:1.6个协程的执行可能全部完成,可能一个也没有执行,这个跟上面的调度策略有关2.第一次执行结果name的值在不同的协程中有可能是一样的,这个跟name的作用域有关,6个协程使用外部的同一个变量name,所以每个协程被丢入任务队列的时候,可能还没运行,下一次迭代有开始了,然后name的值变成了第一个,或者其他的,然后马上处于Gwaiting状态的协程就马上去执行,这个时候name的执行是目前迭代的那个值,从而可能导致多个协程使用同一个name的值。
0 0
- 1.Gorontine和Channel
- 缓冲channel和无缓冲channel
- 【NIO】1. Channel、Buffer
- Channel
- channel
- channel
- Channel
- channel
- Channel
- Channel
- 深入浅出NIO Channel和Buffer
- zigbee改变pandid和channel
- 深入浅出NIO Channel和Buffer
- 分享 关于缓冲的channel和非缓冲的channel
- golang的缓冲channel和无缓冲channel的区别
- Golang range channel、close channel 遍历和关闭
- 第一篇 channel和channelartlist标签详解
- 串口修改PAN ID和Channel
- Launcher3源码分析(DeviceProfile)
- BAT 批处理脚本 教程
- centos7 LVS 配置
- 自定义控件(倒计时篇)
- GradientDrawable 动态设置背景的使用
- 1.Gorontine和Channel
- Hibernate中Criteria的完整用法
- 大话数据结构之:稠密索引
- 编译时注解Butterknife源码解析之深入篇(雷惊风)
- 多台Mac电脑使用同一个apple开发者账号测试
- 后台开发学习(六)PHP语法基础
- 深度学习笔记(1):caffe 添加新层 attention LSTM layer和LSTM layer代码精读
- 关于数据库取出的数据回车换行符无法替换问题!
- KNN算法与Kd树