鍍金池/ 問答/GO/ 協(xié)程如何處理這種情況?

協(xié)程如何處理這種情況?

從redis list獲取數(shù)據(jù),然后將數(shù)據(jù)傳給三個(gè)模塊,這三個(gè)模塊都進(jìn)行復(fù)雜的處理,但是我不關(guān)心處理的結(jié)果。最開始的時(shí)候是用php寫的,但是效率堪憂。。打算用go重構(gòu),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++ {
        //起協(xié)程處理
        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)
}

但是測試的結(jié)果是main函數(shù)執(zhí)行完了,協(xié)程沒有輸出打印信息....這種情況該如何處理?

另外一個(gè)寫文件測試:

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++ {
        //起協(xié)程處理
        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一下就有輸出.....

回答
編輯回答
祉小皓

main函數(shù)結(jié)束之后,整個(gè)進(jìn)程就結(jié)束了,協(xié)程還沒來得及執(zhí)行。
可以使用 sync.waitgroup 來處理這個(gè),有挺多例子的,你看一下就會(huì)了

2017年4月27日 13:48
編輯回答
青裙

兩種: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")
}
2018年6月9日 09:39