登录
首页 >  Golang >  Go问答

设置goroutine的最大数量

来源:stackoverflow

时间:2024-03-15 12:09:26 227浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《设置goroutine的最大数量》,涉及到,有需要的可以收藏一下

问题内容

我正在学习 golang,但遇到了一些困难。我已经研究过 google,但没有进展。

我编写了一个代码,通过多个服务器的 icmp 检查 rtt。

它有这个结构:

type server struct {
    id  uint
    ip  string
    rtt time.duration
}

它有一个包含多个服务器的切片(它是一个数组吗?)。 对于此切片中的每个服务器,我调用函数 getrtt 返回 rtt,然后将其存储在 server.rtt 上,因为在 for 循环之后,我想打印所有服务器及其各自的 rtt。

for _, server := range servers {
    server.rtt = getRTT(server.ip) / time.Millisecond
}
fmt.Println(servers)

问题是同步,所以一一发送“ping”。我想让这个异步并限制最大 goroutine。示例:一次调用 20 个 getrtt。

我正在阅读有关 goroutine、maxgroup、channel 的内容,但到目前为止我还没有了解。


解决方案


go 中有很多模式可以为 goroutine 设置阈值。我最喜欢的方法之一是使用管道。在管道模式中,您创建一组正在运行的 goroutine 并将一个结构传递给它们作为工作。

以下代码是管道的说明性示例。请注意,您必须提供一种同步方式来等待 goroutine 终止,例如使用 sync.WaitGroup

package main

import "fmt"

type handler struct {
        workStream chan int
}

func (h handler) handle() {
        for w := range h.workStream {
                fmt.Printf("do some work with %d\n", w)
        }
}

func main() {
        h := handler{
                workStream: make(chan int),
        }

        // run goroutines as much as you want
        for i := 0; i < 5; i++ {
                go h.handle()
        }

        for i := 0; i < 1000; i++ {
                h.workStream <- i
        }

        close(h.workStream) // by closing this channel all goroutines all killed

        // TODO: wait for all goroutines to die
}

理论要掌握,实操不能落!以上关于《设置goroutine的最大数量》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>