当前位置: 首页 > 面试题库 >

等待n个goroutine终止

臧威
2023-03-14
问题内容

我需要启动大量goroutine,并等待其终止。直观的方法似乎是使用通道来等待所有操作完成:

package main

type Object struct {
    //data
}

func (obj *Object) Update(channel chan int) {
    //update data
    channel <- 1
    return
}

func main() {

    channel := make(chan int, n)
    list := make([]Object, n, m)
    for {
        for _, object := range list {
            go object.Update(channel)
        }
        for i := 0; i < n; i++ {
            <-channel
        }
        //now everything has been updated. start again
    }
}

但是问题是对象的数量以及goroutine的数量可能会改变。是否可以更改通道的缓冲区大小?

也许有更优雅的方式做到这一点?


问题答案:

我已经使用WaitGroup作为此问题的解决方案。翻译您的当前代码,并附上一些日志,以明确正在发生的事情:

package main

import "sync"
import "fmt"
import "time"

type Object struct {
    //data
}

func (obj *Object) Update(wg *sync.WaitGroup) {
    //update data
    time.Sleep(time.Second)
    fmt.Println("Update done")
    wg.Done()
    return
}

func main() {
    var wg sync.WaitGroup
    list := make([]Object, 5)
    for {
        for _, object := range list {
            wg.Add(1)
            go object.Update(&wg)
        }
        //now everything has been updated. start again
        wg.Wait()
        fmt.Println("Group done")
    }
}


 类似资料:
  • 问题内容: 我有以下代码片段。 如您所见,我在goroutine中运行了两个函数errName和errEmail。我将错误类型的通道作为参数传递。如果其中一个先完成,它应该通过通道发送错误并关闭它。因此,第二个仍在运行的goroutine不再需要运行,因为我已经遇到了错误,并且我想终止仍在运行的goroutine。这就是我在上面的示例中尝试达到的目标。 当我运行程序时,出现错误 我知道,当我删除c

  • 问题内容: 我有一个代码,其中单个goroutine将触发不确定数量的子goroutine,而后者又将触发更多的goroutine,依此类推。我的目标是等待所有子goroutine完成。 我不知道我将要预先触发的goroutine的总数,所以我不能使用sync.WaitGroup,理想情况下,我不必人为地限制通过channel- as- semaphore 模式运行的goroutine的总数。 简

  • 问题内容: 我遇到的问题是,有时我启动的线程在调用它之前就完成了。看来这使我的程序等待不再发生的事情()。如何确保不等待线程完成? 问题答案: 如果您阅读JavaDocs for Thread,它将告诉您 永远不要在Thread对象上使用。您应该使用join()

  • 问题内容: 如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案 确实 并行运行这两个操作,但如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。 如果您只想启动它们,并行运行它们,并获得

  • 问题内容: 我如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案确实并行运行这两个操作,但是如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。如果您只想启动它们,并行运行它们,并获得两

  • 问题内容: 请考虑以下代码片段: 这是在小程序中添加一个标签,该标签显示了Worker线程的一些中间结果(使用发布/处理方法)。最后,标签从小程序的窗格中删除。我的问题是,如何创建多个标签,每个标签都有自己的Worker线程,并在完成标签后将其删除? 提前致谢。 更新: 我希望这可以澄清我的问题。我希望在所有工作人员都完成任务后立即删除所有标签,而不是在每个工作人员都完成之后立即删除。 更新2: