【问题标题】:Wait for one goroutine to finish [duplicate]等待一个goroutine完成[重复]
【发布时间】:2019-02-01 12:30:01
【问题描述】:

我正在 8 个不同的 goroutine 上运行一个 CPU 密集型脚本。这些 goroutine 中的每一个都至少需要几分钟才能完成,我想知道这样的事情是否可能:

for i := 0; i < len(input); i += 1 {
  wait_for_number_of_processes_running_to_be_less_than_8
  go calc_math_and_things(input[i])
}

【问题讨论】:

  • 看看这个golang.org/pkg/sync/#WaitGroup。据了解,您总是希望正在运行的进程为 8。您可以通过等待组来实现这一目标
  • 但是如果我调用waitgroup.wait(),它会等待所有的goroutines完成。我只是希望它等待其中任何一个完成。显示golang.org/pkg/sync/#WaitGroup 的等待方法会一直等到正在运行的子进程为0。我想等到它小于8,而waitgroup 无法做到这一点。
  • 从技术上讲,waitrgroup 会一直等待,直到其计数器为 0。计数器不是基于 goroutine 的数量,这只是建议的使用场景。它只是一个计数器,您可以使用Add 添加,使用Done 递减,并使用Wait 阻止直到计数器为0。您可以完全控制它。

标签: go goroutine


【解决方案1】:

您可以使用缓冲通道来返回 goroutine 的结果并指示终止,当您从该通道读取时,您会启动一个新的 goroutine。类似的东西:

const maxNRoutine = 8
var routineCtr int
var resultCh = make(chan int, maxNRoutine)

for i := 0; i < len(input); i += 1 {
    if routineCtr < maxNRoutines {
        go calc_math_and_things(resultCh, input[i])
        routineCtr++
        continue
    }
    var result = <- resultCh // go routine is done, log result and start a new one
    println(result)
    go calc_math_and_things(resultCh, intput[i])
}

在你的日常生活中:

func calc_math_and_things(resultCh chan<- int, input byte) {
     // ... do some stuff
     resultCh <- 1
}

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 2018-02-24
    • 1970-01-01
    • 2014-11-15
    • 2023-04-03
    • 2015-11-19
    • 2017-12-17
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多