协程如何处理这种情况?

从redis list获取数据,然后将数据传给三个模块,这三个模块都进行复杂的处理,但是我不关心处理的结果。最开始的时候是用php写的,但是效率堪忧。。打算用go重构,go代码如下:

package main

import (
    "fmt"
    "os"
)

func sum(values string, typeValue int) {
    switch typeValue {
    case 0:
        a(values)
        break
    case 1:
        b(values)
        break
    case 2:
        c(values)
        break
    }
}
func main() {
    for i := 0; i < 3; i++ {
        //起协程处理
        go sum("a", i)
    }
    fmt.Println("done")

}
func a(values string) {
    fmt.Println(values)

}
func b(values string) {
    fmt.Println(values)
}
func c(values string) {
    fmt.Println(values)
}

但是测试的结果是main函数执行完了,协程没有输出打印信息....这种情况该如何处理?

另外一个写文件测试:

package main

import (
    "fmt"
    "time"
)

func sum(values string, typeValue int) {
    switch typeValue {
    case 0:
        a(values)
        break
    case 1:
        b(values)
        break
    case 2:
        c(values)
        break
    }
}
func main() {
    for i := 0; i < 3; i++ {
        //起协程处理
        go sum("a", i)
    }
    time.Sleep(3)
    fmt.Println("done")

}
func a(values string) {
    fmt.Println(values)

}
func b(values string) {
    fmt.Println(values)
}
func c(values string) {
    fmt.Println(values)
}

用time sleep一下就有输出.....

阅读 1.8k
2 个回答

两种:channel 或 sync.WaitGroup

package main

import (
    "fmt"
)

func main() {
    c := make(chan bool)
    for i := 0; i < 100; i++ {
        go func(v int) {
            fmt.Println(v)
            c <- true
        }(i)
    }
    for i := 0; i < 100; i++ {
        <- c
    }
    fmt.Println("done")
}
package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        go func(v int) {
            fmt.Println(v)
            defer wg.Done()
        }(i)
        wg.Add(1)
    }
    wg.Wait()
    fmt.Println("done")
}

main函数结束之后,整个进程就结束了,协程还没来得及执行。
可以使用 sync.waitgroup 来处理这个,有挺多例子的,你看一下就会了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题