- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试拆分一组 goroutine,然后等待它们全部完成。
import "sync"
func doWork(wg sync.WaitGroup) error {
defer wg.Done()
// Do some heavy lifting... request URL's or similar
return nil
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go doWork(wg)
}
wg.Wait()
}
但是,当我运行这段代码时,出现以下错误:
fatal error: all goroutines are asleep - deadlock!
goroutine 16 [semacquire]:
sync.runtime_Semacquire(0xc20818c658)
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/sema.goc:199 +0x30
sync.(*WaitGroup).Wait(0xc2080544e0)
/usr/local/Cellar/go/1.3/libexec/src/pkg/sync/waitgroup.go:129 +0x14b
main.main()
/Users/kevin/code/vrusability/scripts/oculus_share_ratings.go:150 +0x398
我很困惑,因为我写得差不多了exactly as the documentation example demonstrates .
最佳答案
您需要传递一个指向 WaitGroup 的指针,而不是 WaitGroup 对象。当您传递实际的 WaitGroup 时,Go 会复制该值,并在副本上调用 Done()
。结果是原始 WaitGroup 将有 10 个 Add 而没有 Done,并且 WaitGroup 的每个副本将有一个 Done(),但是当 WaitGroup 传递给函数时有许多 Add。
改为传递一个指针,每个函数都将引用相同的 WaitGroup。
import "sync"
func doWork(wg *sync.WaitGroup) error {
defer wg.Done()
// Do some heavy lifting... request URL's or similar
return nil
}
func main() {
wg := &sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go doWork(wg)
}
}
关于go - 使用 sync.WaitGroup 时获取 "fatal error: all goroutines are asleep - deadlock!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234898/
我正在尝试制作一个代码来扫描一个文件夹链接我的所有文件,并根据他的大小制作一个“前 10 名”,并根据他的内容和他的名字制作一个正则表达式。文件。根据内容,我使用 goroutines 创建 chan
我有一个在 for 循环中运行的 goroutine: func main(){ for _, i := range x{ go httpR
为什么像这样简单的东西不起作用? c1 := make(chan string) c1 <- "foo" fmt.Println(<-c1) 但是如果我把它放在一个 go routine 中它会起作用
下面的代码 ( http://play.golang.org/p/ikUtdoKOo5 ) 应该向多个客户端广播一条消息。但它不起作用,我不明白为什么。 package main import "fm
给定以下简单的 Go 程序 package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter
在继续工作之前,我一直遵循检查 channel 中是否有任何内容的模式: func consume(msg <-chan message) { for { if m, ok := <-ms
我的 dicerolling 程序发生了一次奇怪的崩溃。它工作正常,但最后它总是说: fatal error :所有 goroutine 都处于休眠状态 - 死锁! goroutine 1 [chan
TL; DR:all goroutines are asleep, deadlock!的一种典型情况,但无法弄清 我正在解析Wiktionary XML转储以构建单词数据库。我将每篇文章的文本解析推迟
练习来自:https://tour.golang.org/concurrency/10 描述: In this exercise you'll use Go's concurrency feature
我有以下 Go 代码 package main import ( "fmt" "math/rand" ) const ( ROCK int = iota PAPER
努力学习并发。我遇到了以下错误: fatal error: all goroutines are asleep - deadlock! 我被告知要添加一个 WaitGroup 和一个关闭 channe
package main import ( "fmt" "os" "os/exec" "bufio" "reflect" ) func runTheComman
我想用 Go 开发一个简单的电子邮件发送器,但遇到了一些问题,这是我的实际代码: package main import ( "flag" "sync" "fmt" ) var
下面的代码适用于硬编码的 JSON 数据,但是当我从文件中读取 JSON 数据时不起作用。我收到 fatal error: all goroutines are sleep - deadlock 错误
我正在做一些实验。下面是我的代码。 package main import ( "fmt" "time" ) func main(){ var a chan int a = make(
我试图了解 channel 是如何运作的。我有这个例子: import ( "fmt" "runtime" "time" ) func greet(c chan string)
我正在使用 Golang 构建护理模拟,但遇到了死锁问题。 Goroutines 用于代表每个赛车手。 这个想法是,一旦赛车手达到目标,就会使用一个 channel 来传达哪个赛车手获胜。 谁能发现我
我正在尝试重现问题并使用以下代码得出最小用例。如果我关闭所有 channel (绕过 i == 0 测试),一切都会按预期进行。 Wg 状态递减并触发完成,main 退出正常。当我(故意)跳过关闭其中
这是引用 Go 编程语言中的以下代码 - 第 8 章 p.238 从下面复制自 this链接 // makeThumbnails6 makes thumbnails for each file rec
我想用 Python 将 mime/multipart 消息写入标准输出,然后使用 mime/multipart 包在 Golang 中读取该消息。这只是一个学习练习。 我尝试模拟 this exam
我是一名优秀的程序员,十分优秀!