堕落不振功业废,勤耕不辍日月新

golang channel与sync.WaitGroup同步

Python hailen 4℃

golang中有2种方式同步程序,一种使用channel,另一种使用sync.WaitGroup。最近在使用golang写一个比较简单的功能 —- host1主机需要先在本机起一个TCP监听,起来后给host2主机发送指令,让其主动给host1主机监听的端口进行连接。最终使用了sync.WaitGroup实现了该功能。本篇就结合一些示例来看下两者的使用。

一、channel并行同步

比如有三个需要取数据的程序同时进行,但是终需要同步并返回数据。我们可以按如下代码操作:

package main
import (
    "fmt"
    "time"
)
func main() {
    messages := make(chan int)
    go func() {
        time.Sleep(time.Second * 3)
        messages <- 1
    }()
    go func() {
        time.Sleep(time.Second * 2)
        messages <- 2
    }()
    go func() {
        time.Sleep(time.Second * 1)
        messages <- 3
    }()
    go func() {
        for i := range messages {
            fmt.Println(i)
        }
    }()
    time.Sleep(time.Second * 5)
}

最终取回的结果是3 2 1 ,但是如果该代码中如果不加time.sleep 5秒的动作,程序执行时会出现主进程还未等各个进程执行完成就结束了。因为go函数可以简单理论为shell里的&操作。当然遇到这样的问题,使用sync.WaitGroup是可以解决的。但如果不用sync.WaitGroup,还是使用channel去处理能不能解决呢?

当然是可以的,我们可以再创建一个无缓存的channel,由于该channel是阻塞的,在所有的数据未取出前,主程序就不退出。具体做法如下:

package main
import (
"fmt"
"time"
)
func main() {
messages := make(chan int)
// Use this channel to follow the execution status
// of our goroutines 
</p>
<p>转载请注明:<a href=我是IT » golang channel与sync.WaitGroup同步

喜欢 (0)or分享 (0)