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

限制运行的go例程

羊舌琛
2023-03-14
问题内容

我有要处理的网址列表,但我想一次运行最大数量的goroutine。例如,如果我有30个网址,那么我只希望10个goroutine并行工作。

我对此的尝试如下:

parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()
urls := flag.Args()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string, *parallel)

for _, url := range urls {
    wg.Add(1)
    go worker(url, client, results, &wg)
}

for res := range results {
    fmt.Println(res)
}

wg.Wait()
close(results)

我的理解是,如果创建一个大小为并行的缓冲通道,那么该代码将阻塞,直到我读取结果通道为止,这将取消阻塞我的代码并允许生成另一个goroutine。但是,此代码似乎在处理完所有网址后不会阻塞。有人可以向我解释如何使用通道限制运行的goroutine的数量吗?


问题答案:

创建所需数量的工作线程,而不是每个URL一个工作线程:

parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()

// Workers get URLs from this channel
urls := make(chan string)

// Feed the workers with URLs
go func() {
    for _, u := range flag.Args() {
        urls <- u
    }
    // Workers will exit from range loop when channel is closed
    close(urls)
}()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string)

// Start the specified number of workers.
for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        for url := range urls {
            worker(url, client, results)
        }
    }()
}

// When workers are done, close results so that main will exit.
go func() {
    wg.Wait()
    close(results)
}()

for res := range results {
    fmt.Println(res)
}


 类似资料:
  • 问题内容: 我在并行计算集群的不同处理器上将Python 3.6脚本作为多个单独的进程运行。多达35个进程同时运行没有问题,但是第36行(及以后)因第二行()上的分段错误而崩溃。有趣的是,第一行不会引起问题。完整的错误消息是: 熊猫和其他一些软件包已安装在虚拟环境中。我已经复制了虚拟环境,因此每个venv中运行的进程不超过24个。例如,上面的错误脚本来自运行在名为的虚拟环境中的脚本。 不论从特定的

  • 问题内容: 我正在阅读有关go包“运行时”的信息,并发现我可以(除其他功能外)(func GOMAXPROCS(n int))设置可用于运行程序的CPU单元数。我可以强制goroutine在我选择的特定CPU上运行吗? 问题答案: 在现代Go中,我不会为了提高效率而将goroutine锁定在线程上。Go 1.5 添加了goroutine调度亲和力,以最小化goroutine在OS线程之间切换的频率

  • 问题内容: 在Linux中,我想运行一个程序,但只能运行有限的时间,例如1秒。如果程序超出此运行时间,我想终止进程并显示错误消息。 问题答案: StackOverflow不允许我删除答案,因为它已被接受。由于它在列表顶部,下面有一个更好的解决方案,因此它获得了否决票。如果您使用的是GNU系统,请按照@wRAR的建议使用代替。因此,希望您停止投票,这是它的工作方式: 您可以使用,,或为秒(如果省略默

  • 我正在寻找一个promise函数包装,它可以在给定的promise运行时限制/节流,以便在给定的时间只运行该promise的一组数量。 在以下情况下,不应同时运行,它们应按照先到先得的顺序一次运行一个。 关于如何设置这样的队列有什么想法吗? 我有一个来自奇妙的的“去盎司”功能。我需要修改它,以限制基于自身执行的promise,而不是延迟。

  • 我创建了一个带方括号的文件,名为< code>[id]。去但我无法建立它。 当我运行< code>go build "[id]时。转到" ,我看到了以下内容: 无法加载包:包主:无效的输入文件名“[id]”。去吧" Go文件名有限制吗?具体来说,什么是不允许的?如果有,请留档。

  • 我有一个作业,它在集群环境中的多个服务器上运行。但是,我想限制作业只在一台服务器中运行,其他服务器不应该运行同一作业,一旦其他服务器启动了它。 我已经使用一些数据库表探索了Spring批处理具有锁机制,但仅在Spring中寻找任何解决方案。