【发布时间】:2017-11-13 16:28:44
【问题描述】:
我正在尝试在完成主题后同步执行两个或多个 goroutine
我编写了一些代码来测试 goroutine 的行为 (我把它当作一个队列,顺便说一句,go 并发教程页面对我没有帮助)
package main
import (
"fmt"
"sync"
)
const size = 10
var vChan chan int = make(chan int, size)
func justSend(wg *sync.WaitGroup) {
defer wg.Done()
for i := 1; i <= 10; i++ {
vChan <- i
}
}
func justPrint(wg *sync.WaitGroup) {
defer wg.Done()
v := <- vChan
fmt.Printf("%4d ", v);
}
func main() {
wg := new(sync.WaitGroup)
go func() {
wg.Add(1)
go justSend(wg)
wg.Wait()
wg.Add(size)
go justPrint(wg)
wg.Wait()
close(vChan)
}()
}
但是它什么也没打印,我们是否应该设计一个 goroutine 总是在那里有一个无限循环,或者我们不能让它正常工作?
(这段代码是为我在构建多个 websocket 连接和测试我们的 API 服务器响应方面的实际问题准备的,所以......我认为在不同的函数之间传递一堆具有相同类型的通道非常烦人,所以我设置了全局)
【问题讨论】:
-
您的应用程序在您有机会获得任何输出之前退出。
go func() { ... })()语句完成后 - 没有任何东西可以阻止程序退出。 -
我不确定你想要完成什么,但我提供这个:play.golang.org/p/GGx5HGOtBL
-
感谢@CeriseLimón 操场的支持,但这是否意味着我需要先关闭通道,然后才能在另一个 go 例程中从中读取值?
-
wg.Add(size)wg.Done 的例程。但是,main在例程完成之前返回。试试go build -race看看比赛检测器是否能发现你错过的一些事情,然后使用delve来逐步检查所有内容
标签: go