• 天狼星
    2019-10-28
    这么操作的话,还是有资源浪费的隐患,10个协程实际都完成了处理,应该是取回一个结果后,其他协程取消之后的处理才好。
    
     3
  • NEVER SETTLE
    2019-03-26
    我比较喜欢老师一边敲代码,一边讲。这样我可以完全跟着思路走,一边就能懂。但是老师提前写好代码,上来直接讲,我有点懵,我每次得暂停把代码看明白了,再继续往下走,有时候再播放第二遍。

    作者回复: 我也希望尽量这样。主要是后面的课程内容相对前面的每一课都多不少,为满足平台对时长的限制,只能将一些代码事先准备好。也建议可以下载我们github上的代码在机器上运行和调试。谢谢

    
     2
  • 风骑
    2020-01-18
    我按照第一种方式测试,一直都是输出的同一个结果,我问了同事,他说是channel里面有个队列机制,希望老师能解答下这个问题吧,周围也没咨询到能够给出答案的人,麻烦老师了

    作者回复: 你运行的是下面代码,由于协程的调度是随机的,所以第一个返回channel的结果也是随机的,你可以多运行几次看看,可以通过命令行 go test -v 试试。
    package concurrency

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

    func runTask(id int) string {
        time.Sleep(10 * time.Millisecond)
        return fmt.Sprintf("The result is from %d", id)
    }

    func FirstResponse() string {
        numOfRunner := 10
        ch := make(chan string, numOfRunner)
        for i := 0; i < numOfRunner; i++ {
            go func(i int) {
                ret := runTask(i)
                ch <- ret
            }(i)
        }
        return <-ch
    }

    func TestFirstResponse(t *testing.T) {
        t.Log("Before:", runtime.NumGoroutine())
        t.Log(FirstResponse())
        time.Sleep(time.Second * 1)
        t.Log("After:", runtime.NumGoroutine())

    }

    
    
  • 时间的奴隶
    2019-04-02
    老师, 如果使用sync.WaitGroup的话, 发现每次输出的, After的gorountine的数量都是不同的, 这个应该怎么理解呢?

    package ch22

    import (
        "fmt"
        "runtime"
        "sync"
        "testing"
        "time"
    )

    var wg sync.WaitGroup

    func runTask(id int) string {
        time.Sleep(time.Millisecond * 10)
        return fmt.Sprintf("The result is from %d", id)
    }

    func FirstResponse() string {
        numOfRunner := 10
        ch := make(chan string, numOfRunner)
        for i := 0; i < numOfRunner; i++ {
            go func(i int) {
                ch <- runTask(i)
            }(i)
        }
        abc := <-ch
        wg.Done()
        return abc
    }

    func TestFirstResponse(t *testing.T) {
        t.Log("Before:", runtime.NumGoroutine())
        wg.Add(1)
        t.Log(FirstResponse())
        wg.Wait()
        // time.Sleep(time.Second)
        t.Log("After:", runtime.NumGoroutine())
    }
    展开

    作者回复: 在检查协程数之前sleep一秒试试,让协程有时间完成和释放

    
    
  • Zen
    2019-03-29
    因为struct是空的, 你往里边随便丢一个成员,不加once输出的地址就不一样了
    
    
  • asdf100
    2019-03-26
    这个虽然只使用了一个结果,但实际上后端也是返回了多个结果的吧?

    作者回复: 是的。只是第一个结果回来就返回接在做下面的事了

    
    
我们在线,来聊聊吧