首页 > 代码库 > 贴一段demo代码,演示channel之间的同步

贴一段demo代码,演示channel之间的同步

package mainimport (    "fmt"    "time")func deskGoRoutine(index int, userChannel chan string, deskChannel chan string) {    for {        fmt.Println("deskGoRoutine", index)        select {        case info := <-userChannel:            if info == "userMsg" {                fmt.Println(info)                deskChannel <- "deskMsg"            }        case <-time.After(time.Second):            fmt.Println("deskGoRoutine", index, "timeout,continue")            continue        }        time.Sleep(time.Second)    }}func userGoRoutine(index int, deskChannel chan string, userChannel chan string) {    for {        fmt.Println("userGoRoutine", index)        select {        case info := <-deskChannel:            if info == "deskMsg" {                fmt.Println(info)                userChannel <- "userMsg"            }        case <-time.After(time.Second):            fmt.Println("userGoRoutine", index, "timeout,continue")            continue        }        time.Sleep(time.Second)    }}func main() {    userChannel := make(chan string)    deskChannel := make(chan string)    go userGoRoutine(0, deskChannel, userChannel)    go deskGoRoutine(0, userChannel, deskChannel)    userChannel <- "userMsg"    select {}}

一个gouRoutine对应一个channel,channel用来同步,如果不加timeout,那么goRoutine在收不到想要的channel数据的时候会死锁,只有加上timeout,才会不断的处理,满足我的需求