- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个示例代码(您可以在 Go Playground 上找到它):
package main
import (
"fmt"
"sync"
"time"
)
func main() {
messages := make(chan int)
var wg sync.WaitGroup
var result []int
// you can also add these one at
// a time if you need to
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
messages <- 1
}()
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
messages <- 2
}()
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
messages <- 3
}()
go func() {
for i := range messages {
fmt.Println(i)
result = append(result, i)
}
}()
wg.Wait()
fmt.Println(result)
}
我得到了这个输出:
2
1
[2 1]
我想我知道为什么会这样,但我无法解决它。 WaitGroup 中有 3 个项目,我的意思是三个 goroutine,第 4 个 groutine 使用 channel 中的数据。当最后一个 groutine 说 wg.Done()
程序结束,因为 wg.Wait() 说每个 goroutine 都完成了,最后一个 goroutine 结果第四个 goroutine 不能消费,因为程序结束了。我尝试在第 4 个函数中使用 wg.Add(1) 和 wg.Done() 添加加一,但在这种情况下我遇到了死锁。
最佳答案
关闭 channel 是一种惯用的 Go 信号模式,如果您关闭缓冲 channel ,消费者可以读取所有排队的数据然后停止。
这段代码可以正常工作:
func main() {
messages := make(chan int)
var wg sync.WaitGroup
var result []int
// you can also add these one at
// a time if you need to
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
messages <- 1
}()
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
messages <- 2
}()
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(time.Second * 1)
messages <- 3
}()
// this goroutine added to signal end of data stream
// by closing messages channel
go func() {
wg.Wait()
close(messages)
}()
// if you need this to happen inside a go routine,
// this channel is used for signalling end of the work,
// also another sync.WaitGroup could be used, but for just one
// goroutine, a single channel as a signal makes sense (there is no
// groups)
done := make(chan struct{})
go func() {
defer close(done)
for i := range messages {
fmt.Println(i)
result = append(result, i)
}
}()
<-done
fmt.Println(result)
}
如您所见,我们刚刚添加了另一个 goroutine,用于在所有生产者完成后关闭 messages
channel 。
关于具有 sync.WaitGroup 的 Goroutine 在最后一个 wg.Done() 之前结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43166750/
var wg sync.WaitGroup var v int32 = 0 for i = 0; i < 100; i++{ go func(){ wg.Add(1) // wro
1。我触发了一个 goroutine(运行第三方程序),我正在使用 wg.Wait() 等待它完成 2。在 wg.Wait() 之前,我想为用户提供一个选项来取消正在运行的第三方程序(如果他愿意的话)
假设我有一个函数 IsAPrimaryColour(),它通过调用其他三个函数 IsRed()、IsGreen() 和 来工作>IsBlue()。由于这三个功能彼此相当独立,因此它们可以同时运行。返回
假设我有一个函数 IsAPrimaryColour(),它通过调用其他三个函数 IsRed()、IsGreen() 和 来工作>IsBlue()。由于这三个功能彼此相当独立,因此它们可以同时运行。返回
我在使用 defer wg.Done 和 channel 时遇到问题。 如果我像下面这样编码,就没有问题。 for i := 0; i < ntasks; i++ { wg.Add(1)
我有一个要抓取的网址列表。我想做的是将所有成功抓取的页面数据存储到一个 channel 中,当我完成后,将其转储到一个 slice 中。我不知道我会得到多少成功的抓取,所以我不能指定一个固定的长度。我
我正在使用 PIC-IoT WG wifi 开发板开展一个项目。我正在尝试修改演示代码以便能够在我自己的服务器上使用它。该演示在多个地方使用了这样的代码: #include static void
我有一个示例代码(您可以在 Go Playground 上找到它): package main import ( "fmt" "sync" "time" ) func main
关闭。 这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 这个问题似乎与 a specific programming problem, a software
所有在 Debian 9+ 上运行都没有问题,使用相同的设置和安装方法。 当我尝试启动服务时 systemctl start wg-quick@wg0 它在日志中显示错误: wg-quick[9290
我目前正在开发一个用 java 实现的已安装桌面应用程序。我打算将 Google Calendar API 集成到应用程序中。 在授权过程中,我来到了这个阶段,我只能通过触发显示用户同意页面的浏览器来
我是一名优秀的程序员,十分优秀!