- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在写 Walk function in the go tutorial基本上按顺序遍历树。我的作品:
package main
import (
"fmt"
"code.google.com/p/go-tour/tree"
)
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk__helper(t *tree.Tree, ch chan int) {
if (t == nil) {
return
}
Walk__helper(t.Left, ch)
ch <- t.Value
Walk__helper(t.Right, ch)
}
func Walk(t *tree.Tree, ch chan int) {
Walk__helper(t, ch)
close(ch)
}
func main() {
ch := make(chan int)
go Walk(tree.New(1), ch)
for v := range ch {
fmt.Println(v)
}
}
为什么我必须使用 go Walk(tree.New(1), ch)
而不仅仅是 Walk(tree.New(1), ch)
?
我的印象是 go
关键字基本上会生成一个新线程。在那种情况下,我们会遇到问题,因为 for 循环可能会在子例程完成之前运行。
奇怪的是,当我取出 go
关键字时,我遇到了死锁。这对我来说是违反直觉的。 go
关键字在这里究竟做了什么?
最佳答案
这里的关键点是 range
与 channel 结合时。
当您在 channel 上range
(在本例中为ch
)时,它会等待项目在 channel 上发送,然后再遍历循环。这是一个安全的“阻塞”操作,在等待 channel 接收项目时不会死锁。
死锁在不使用 goroutine 时发生,因为您的 channel 没有缓冲。如果您不使用 goroutine,那么方法调用是同步的,Walk
会在 channel 上放一些东西……它会阻塞,直到它被弹出。它永远不会弹出...因为方法调用是同步的。
I was under the impression that the go keyword basically spawns a new thread
..这是不正确的。要了解那里发生的事情,还需要许多更重要的实现细节。您应该将 goroutine 的思维过程与线程分开。将 goroutine 视为并发执行的一段代码,没有“线程”。
关于go - 为什么我需要用新的子例程运行 Walk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25923961/
我最近购买了《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
我是一名优秀的程序员,十分优秀!