- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL; DR:all goroutines are asleep, deadlock!
的一种典型情况,但无法弄清
我正在解析Wiktionary XML转储以构建单词数据库。我将每篇文章的文本解析推迟到一个goroutine,希望它可以加快处理速度。
它是7GB,并且在串行方式下在我的计算机中处理时间不到2分钟,但是如果我可以利用所有内核,那为什么不行。
我是线程一般的新手,出现了all goroutines are asleep, deadlock!
错误。
怎么了
这可能根本不起作用,因为它使用了无缓冲的 channel ,因此所有goroutine最终都有效地串行执行,但是我的想法是学习和理解线程并使用不同的替代方法测试它需要花费多长时间:
runtime.NumCPU()
一样多的goroutines while tag := xml.getNextTag() {
wg.Add(1)
go parseTagText(chan, wg, tag.text)
// consume a channel message if available
select {
case msg := <-chan:
// do something with msg
default:
}
}
// reading tags finished, wait for running goroutines, consume what's left on the channel
for msg := range chan {
// do something with msg
}
// Sometimes this point is never reached, I get a deadlock
wg.Wait()
----
func parseTagText(chan, wg, tag.text) {
defer wg.Done()
// parse tag.text
chan <- whatever // just inform that the text has been parsed
}
最佳答案
在Go Playground上的完整示例中,您:
results := make(chan langs)
)和一个 WaitGroup (第40行,var wait sync.WaitGroup
)。到目前为止,一切都很好。 if ...various conditions... {
wait.Add(1)
go parseTerm(results, &wait, text)
}
for res := range results {
...
}
close(results)
了。此循环使用从 channel 读取的阻塞。只要某些编写程序goroutine仍在运行,阻塞读取就可以在不停止整个系统的情况下进行阻塞,但是当最后一个编写程序完成写入并退出时,将没有剩余的编写程序goroutine。其余的goroutine可能会救您,但没有。 var wait
(在正确的位置添加1,然后在编写器的正确位置调用
Done()
),因此解决方案是再添加一个goroutine,这将是一种抢救您的方法:
go func() {
wait.Wait()
close(results)
}()
for res := range results
循环之前就剥离此救援程序goroutine。 (如果您更早地将其分离,则可能会看到
wait
变量计数到零的时间太早,就在通过拆分另一个
parseTerm
将其重新计数之前)。
wait
变量的
Wait()
函数,直到最后一个编写程序goroutine调用了最终的
wait.Done()
为止,这将取消阻塞此goroutine。然后,此goroutine将调用
close(results)
,它将安排
for
goroutine中的
main
循环完成,从而取消对该goroutine的阻塞。当此goroutine(救援人员)返回并因此终止时,不再有救援人员,但我们不再需要任何救援人员。
wait.Wait()
:由于直到新goroutine中的
for
已被解除阻止之前
wait.Wait()
才终止,所以我们知道下一个
wait.Wait()
将立即返回。因此,我们可以丢弃第二个调用,尽管将其留在无害)
关于go - 一例 `all goroutines are asleep - deadlock!`我不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59432608/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!