gpt4 book ai didi

go - 创建 goroutine 并设置最大 goroutines

转载 作者:IT王子 更新时间:2023-10-29 02:35:07 28 4
gpt4 key购买 nike

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

我编写了一个代码,通过多台服务器的 ICMP 检查 RTT。

它有这样的结构:

type Server struct {
id uint
ip string
rtt time.Duration
}

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

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

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

我正在阅读有关 goroutines、maxgroup、channel 的信息,但到目前为止我还没有了解。

最佳答案

Go 中有很多模式来设置 goroutines 的阈值。我的最爱之一是使用管道。在管道模式中,您创建一组运行的 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
}

关于go - 创建 goroutine 并设置最大 goroutines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56746206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com