在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

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

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

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é)程還沒(méi)來(lái)得及執(zhí)行。
可以使用 sync.waitgroup 來(lái)處理這個(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