下面,我粘贴了伪代码。 我是 Golang 新手,想了解如何使用 goroutine。 我想确保我的程序不会因死锁而崩溃。如何有效地等待和调用 goroutine,尤其是在一个 goroutine 调用另一个 goroutine 的情况下? 如果一个goroutine G1调用另一个goroutine G2,G2将负责处理G2,那么是G1还是主进程?
package main
import "fmt"
func rule2(){
ruleList2 = int[]{1, 2, 3, 4, 5}
for _, val := range ruleList2 {
go func() {
//do somethings
}()
}
return result
}
func ruleCalled(key int){
if key == 2 {
return rule2()
}
//do somethings, without goroutines if key is not 2
// strire in result var
return result
}
func main() {
ruleList = [1, 2, 3, 4, 5]
for _, val := range ruleList{
go func(key int) {
ruleCalled(key)
}(val)
}
fmt.Println("done!")
}
有人可以帮我找到以下问题的答案吗 在 golang 中使用 goroutine 的最佳方式,特别是在一个 goroutine 调用另一个 goroutine 的情况下? 如何避免竞争状况?
您可以使用辅助库来处理 goroutune,例如 pipers
import github.com/kozhurkin/pipers
func rule2() ([]int, error) {
ruleList2 := []int{1, 2, 3, 4, 5}
pp := pipers.FromArgs(ruleList2, func(i int, rule int) (int, error) {
return rule * rule, nil
})
return pp.Resolve()
}
func main() {
ruleList := []int{1, 2, 3, 4, 5}
pp := pipers.FromArgs(ruleList, func(i int, rule int) ([]int, error) {
if rule == 2 {
return rule2()
}
return []int{rule}, nil
})
res, err := pp.Resolve()
fmt.Println(res, err)
// [[1] [1 4 9 16 25] [3] [4] [5]] <nil>
}
如果不需要错误处理,可以简化一下
import github.com/kozhurkin/pipers/pips
func rule2() []int {
ruleList2 := []int{1, 2, 3, 4, 5}
return pips.FromArgs(ruleList2, func(i int, rule int) int {
return rule * rule
})
}
func main() {
ruleList := []int{1, 2, 3, 4, 5}
res := pips.FromArgs(ruleList, func(i int, rule int) []int {
if i == 2 {
return rule2()
}
return []int{rule}
})
fmt.Println(res)
// [[1] [2] [1 4 9 16 25] [4] [5]]
}