V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
kangkang
V2EX  ›  Go 编程语言

关于 goroutine 的一个小问题

  •  
  •   kangkang · 2018-02-07 17:42:30 +08:00 · 1804 次点击
    这是一个创建于 2471 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:


    sum 函数对传入的数组做累加,main 开了两个 goroutine 分别将两个数组传入 sum 函数,按理说输出应该是
    17 -5 12

    但是我在第一个 goroutine 后面再加一个延时之后,结果就变成了
    -5 17 12

    所以,我的问题是,为什么会这样啊...
    17 条回复    2018-02-23 13:07:03 +08:00
    myself659
        1
    myself659  
       2018-02-07 17:50:37 +08:00
    goroutine 执行顺序与代码顺序并不关联,如果你要看到效果,建议将 sleep 时间加大
    kangkang
        2
    kangkang  
    OP
       2018-02-07 17:53:49 +08:00
    @myself659 放再大都是-5 17..而且我觉得对于这种小小的代码,执行顺序还是有关系的啊,谁先执行谁就先进 channel,也就是先被 print,不是这样吗
    brucemaclin
        3
    brucemaclin  
       2018-02-07 18:01:54 +08:00
    代码问题吧 sum(s[len(s)/2:], c) 明明先传的后半部分。
    myself659
        4
    myself659  
       2018-02-07 19:17:04 +08:00
    @brucemaclin 正解
    kangkang
        5
    kangkang  
    OP
       2018-02-07 20:15:29 +08:00 via iPhone
    @brucemaclin 是的,这是我的错误。但是如果把延时去掉,结果会反过来,这又如何解释呢
    willchen
        6
    willchen  
       2018-02-07 20:40:41 +08:00
    应该是切片时间导致的 s[len(s)/2:] 的 时间 大于 s[:len(s)/2] 的时间
    Jevan
        7
    Jevan  
       2018-02-07 20:50:23 +08:00
    @kangkang #5 没有吧,我刚都试了试,怎么样,结果都是-5 17 12。



    goofool
        8
    goofool  
       2018-02-07 21:23:47 +08:00
    sum 时间复杂度都是一样的,正常就是应该最早创建的 goroutine 先返回啊,就是-5 17 12
    sunsh2017
        9
    sunsh2017  
       2018-02-08 01:45:55 +08:00 via Android
    mark
    kangkang
        10
    kangkang  
    OP
       2018-02-08 02:24:07 +08:00 via iPhone
    @Jevan
    @goofool
    @willchen
    感谢回答,我怀疑是我测试用的官方 playground 的原因,明天换到本地编译试试
    hqlyz
        11
    hqlyz  
       2018-02-08 09:24:02 +08:00
    @kangkang 我在本地测试结果与你的一样,猜测同时开启 2 个 goroutine 返回结果的顺序是不确定的,不同的机器会有不同结果表现
    kangkang
        12
    kangkang  
    OP
       2018-02-08 14:21:26 +08:00
    @willchen make sense.但是为什么时间会不一样呢
    willchen
        13
    willchen  
       2018-02-08 14:47:39 +08:00
    @kangkang hhh 瞎说的 不对不对
    willchen
        14
    willchen  
       2018-02-08 15:01:09 +08:00
    @kangkang 跟 Goroutine 调度器有关 其实是 随机的
    kangkang
        15
    kangkang  
    OP
       2018-02-08 15:09:57 +08:00
    @willchen 不是啊,不改代码的话,重复 n 次都是一样的结果
    willchen
        16
    willchen  
       2018-02-08 16:08:17 +08:00   ❤️ 1
    @kangkang 我写了个循环 还是有小概率出现另一种情况的 你试试
    nekoyaki
        17
    nekoyaki  
       2018-02-23 13:07:03 +08:00   ❤️ 1
    @kangkang
    正确的理解是,“不要对多个 goroutine 的执行顺序做任何的假设、不要试图去解释多个并发 goroutine 实际的顺序问题。”。
    按目前的实现上,你高概率会测出一样的结果,但是在其他的机器、其他的代码、其他的环境、其他版本的 golang 上,这些顺序是不保证的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5343 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:47 · PVG 13:47 · LAX 21:47 · JFK 00:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.