【问题标题】:How to have constant number of worker functions executing at all times? [duplicate]如何始终执行恒定数量的工作函数? [复制]
【发布时间】:2021-04-26 08:25:04
【问题描述】:

假设我有一个包含 10 个工作函数的列表,我希望 2 个(或更多)始终并行运行,当一个完成时在列表中前进,然后循环并永远继续。所以不要让服务器超载。

workers := make([]func(), 10)
for i := 0; i < 10; i++ {
  workers[i] = createWorker()
}

func createWorker() func() {
  return func() {
    fmt.Println("I am working")
    time.Sleep(time.Duration(rand.Intn(5)) * time.Second)
  }
}

// My idea, keep sending workers to a buffered channel of size 2, 
// so when one finishes it's no longer filled up and another worker is sent
workerChan := make(chan func(), 2)
go func() {
  worker := <-workerChan
  worker()
}()

for {
  for _, worker := range workers {
    workerChan <- worker
  }
}

这将运行第一个工作函数,仅此而已。也许这个想法是正确的,我需要一些关于如何正确实施它的指导。

【问题讨论】:

标签: go


【解决方案1】:

你已经到达那里了。

func worker(ch chan func()) {
    // worker needs to read from a channel until channel is closed, 
    // then it will stop
    for work := range ch {
        work()
    }
}

func main() {
    workers := 2
    workerChan := make(chan func(), 10)

    for i := 0; i < workers; i++ {
        // start workers
        worker(workerChan)
    }
    
    // add work to channel
    workerChan <- func() {
        // do work
    }
}

如果你将它包装在一个结构中,你可以用它创建一个非常通用的工作池,执行你给它的任何东西。

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2011-09-28
    • 2012-07-24
    • 2013-06-26
    • 2023-01-27
    • 1970-01-01
    • 2019-03-30
    • 2014-01-20
    • 2020-03-31
    相关资源
    最近更新 更多