【发布时间】:2021-06-18 00:37:17
【问题描述】:
我想使用github.com/xlab/treeprint 包构建并显示链接问题树。我有一个工作版本,但它不使用 go-routines,而且似乎是一个不错的候选者。
tree 部分可能无关紧要,但如果我从函数返回不同的值,我可以用不同的方式构建它。
func main {
tree := treeprint.New()
recurseTreeFetching(fetcher, tree, *issueID)
fmt.Println(tree.String())
}
func recurseTreeFetching(fetcher Fetcher, tree treeprint.Tree, issueID string) {
issues := fetcher.fetchIssues(issueID)
if len(issues) == 0 {
return
}
for i := 0; i < len(issues); i++ {
currIssueID := issues[i].Key
currBranch := tree.AddBranch(currIssueID)
recurseTreeFetching(fetcher, currBranch, currIssueID)
}
}
这可行,但速度很慢。我看过这样的答案:/recursive-goroutines-what-is-the-neatest-way-to-tell-go-to-stop-reading-from-ch,但我正在努力让它工作.
我没有限制深度,也没有检查已经添加的节点。
我尝试过“增加一些并发性”。但是函数死锁了。任何指导或修复?
func main {
tree := treeprint.New()
var ch chan int
go recurseTreeFetching(fetcher, tree, *issueID, ch)
tocollect := 1
for n := 0; n < tocollect; n++ {
tocollect += <-ch
}
fmt.Println(tree.String())
}
func recurseTreeFetching(fetcher Fetcher, tree treeprint.Tree, issueID string, ch chan int) {
issues := fetcher.fetchIssues(issueID)
if len(issues) == 0 {
return
}
ch <- len(issues)
for i := 0; i < len(issues); i++ {
currIssueID := issues[i].Key
currBranch := tree.AddBranch(currIssueID)
go recurseTreeFetching(fetcher, currBranch, currIssueID, ch)
}
}
【问题讨论】:
-
在我看来你没有实例化频道。你的错误是
goroutine 1 [chan send (nil chan)]:吗?在此处包含您的错误。 -
没有错误。程序刚刚停止。
-
不可重现。代码不足以证明 OP 遇到的问题。