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

随时可以运行x个goroutine

曾晨
2023-03-14
问题内容

我看到了很多有关如何使Go等待x数量的goroutine完成的教程和示例,但是我想做的是确保始终有x数量的运行,因此一旦结束,就会启动一个新的goroutine。

具体来说,我有几十万个“要做的事情”正在处理MySQL产生的一些事情。所以它是这样的:

db, err := sql.Open("mysql", connection_string)
checkErr(err)
defer db.Close()

rows,err := db.Query(`SELECT id FROM table`)
checkErr(err)
defer rows.Close()

var id uint
for rows.Next() {
    err := rows.Scan(&id)
    checkErr(err)
    go processTheThing(id)
    }
checkErr(err)
rows.Close()

目前,它将启动数十万个线程processTheThing()。我需要的是启动了最多x个数字(我们称其为20)goroutines。因此,它从在前20行中启动20开始,然后从当前goroutine中的一个结束后的下一个id启动新的goroutine。因此,在任何时间点总是有20个正在运行。

我敢肯定这是非常简单/标准的,但是我似乎无法在任何教程或示例中找到很好的解释,或者如何做到这一点。


问题答案:

感谢大家帮助我解决这个问题。但是,尽管您都帮助我理解了该技术,但我认为没有人真正提供既可行又简单/易于理解的功能。

最后,我认为作为对我的特定问题的解答,我认为它更易于理解和实用,因此,如果其他人有相同的问题,我将在此处发布。

不知何故,最终看起来很像OneOfOne发布的内容,这很棒,因为现在我明白了。但是我一开始发现OneOfOne的代码很难理解,因为将函数传递给函数使人们很难理解到底是什么。我认为这种方式更有意义:

package main

import (
"fmt"
"sync"
)

const xthreads = 5 // Total number of threads to use, excluding the main() thread

func doSomething(a int) {
    fmt.Println("My job is",a)
    return
}

func main() {
    var ch = make(chan int, 50) // This number 50 can be anything as long as it's larger than xthreads
    var wg sync.WaitGroup

    // This starts xthreads number of goroutines that wait for something to do
    wg.Add(xthreads)
    for i:=0; i<xthreads; i++ {
        go func() {
            for {
                a, ok := <-ch
                if !ok { // if there is nothing to do and the channel has been closed then end the goroutine
                    wg.Done()
                    return
                }
                doSomething(a) // do the thing
            }
        }()
    }

    // Now the jobs can be added to the channel, which is used as a queue
    for i:=0; i<50; i++ {
        ch <- i // add i to the queue
    }

    close(ch) // This tells the goroutines there's nothing else to do
    wg.Wait() // Wait for the threads to finish
}


 类似资料:
  • 问题内容: JVM是否可以同时运行多个程序?如果是这样,怎么办?如果没有,为什么? 要运行程序,我们只需 但是我们可以使用同一个JVM实例来运行另一个程序吗? 问题答案: 答案取决于您对“程序”的定义。具有方法并以其开头的Java程序通常无法在同一JVM中运行,因为没有内置的资源或名称空间分隔。例如,如果两个程序使用同一库的冲突版本怎么办? 我们还提供了旨在共享JVM的应用程序,例如企业应用程序。

  • 我试图帮助我的队友使用TestNG编写更稳定、更独立的Selenium UI自动化测试。因此,我想知道是否有人有实施以下内容的经验: 从功能和/或烟雾测试包中随机选择6项测试 将新开发的测试置于套件的中间 在每次运行前更改包中的随机测试选择,在配置上运行3次

  • 问题内容: 我有桌子 我希望从此表中至少获得30个随机物品,其中总价格等于500,那么实现此目的的最佳方法是什么? 我看过了这个解决方案,它看起来也有类似的问题。MySQL选择3个随机行,其中三行之和小于值 我想知道是否还有其他更易于实施和/或更有效的解决方案 问题答案: 如果您的产品列表满足以下 假设, 则有解决方案: 您有所有价格在0.00到500.00之间的产品。例如。0.01、0.02等至

  • 我有一个maven POM,我想用它作为模板,根据我传递给它的参数,生成具有不同名称的工件。但我不知道如何在运行时指定artifactId。 如果我参数化

  • 问题内容: 简而言之,我需要能够将已编译的可执行文件粘贴到Java jar文件中,然后能够从Java运行它(可能通过)。 的 原因 ,是我想使用Java来包裹ImageMagick的可执行文件成分的图像处理弹性的Map Reduce任务。EMR只希望获取一个jar文件,因此我认为没有空间在旋转的数据节点上安装软件。 问题答案: jar中的可执行文件是一种资源,您可以通过Stream访问它,并将可执

  • 问题内容: 注:请不要 不 上交叉编译的所有危险评。谢谢。 我遇到一种情况,我们需要为Java 5 JVM编译Java 6源(以确保JAX-WS用法正确)。以前我们使用ant ant脚本(显然可以)完成了此操作,但是在迁移到Maven之后,我们发现它最终以javac抱怨: 是否有 任何 对Linux(Ubuntu的11.10,86),其中使用javac可以做到这一点的Java分配? 编辑:似乎没有