1.Gorontine和Channel

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的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值