golang 中一个 goroutine 调用另一个 goroutine 如何处理

问题描述 投票:0回答:1

下面,我粘贴了伪代码。 我是 Golang 新手,想了解如何使用 goroutine。 我想确保我的程序不会因死锁而崩溃。如何有效地等待和调用 goroutine,尤其是在一个 goroutine 调用另一个 goroutine 的情况下? 如果一个goroutine G1调用另一个goroutine G2,G2将负责处理G2,那么是G1还是主进程?

How we want to call goroutines

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 的情况下? 如何避免竞争状况?

go mutex race-condition goroutine waitgroup
1个回答
0
投票

您可以使用辅助库来处理 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]]

}
© www.soinside.com 2019 - 2024. All rights reserved.