登录
首页 >  Golang >  Go问答

在开始新的例程之前停止一个例程

来源:stackoverflow

时间:2024-04-15 11:03:30 455浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《在开始新的例程之前停止一个例程》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

有一个处理来自客户端的请求的服务器。每个请求都会在 for 循环中启动一个 go 例程,如何在新例程开始之前停止前一个 go 例程。

for {
    select {
    case discoveryRequest := <-discoveryRequestChannel:

        
        for _, resourceNames := range discoveryRequest.ResourceNames {
            accumulatedResourceNames = append(accumulatedResourceNames, resourceNames) //resources requested are accumulated
        }

        log.Infof("request resources: %v", accumulatedResourceNames)

        secret, err := s.MakeSecretResponse(accumulatedResourceNames, nonce)
        if err != nil {
            log.Error(err) // Handling all the errors from the above layers. no need for context as they are provided in previous layers.
            continue
        }
        if err := stream.Send(secret); err != nil {
            log.Errorf("Error when sending stream to envoy %v ", err)
        }
        version = secret.VersionInfo
        
        secretsRenewEndChannel <- true
        close(secretsRenewEndChannel)
        log.Info("kill switch")
        go s.SecretsRenewer(version, accumulatedResourceNames, secretsRenewChannel, secretsRenewEndChannel)
        isSecretRenewRunning = true
        log.Info("set to true")
        secretsRenewEndChannel = make(chan bool)

解决方案


您的代码不清楚。为什么需要在循环中像这样 select ?您在其中选择什么?您可以直接从频道接收。

您可能正在此处寻找工作人员池。以下是 from gobyexample 的示例:

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("worker", id, "started  job", j)
        time.Sleep(time.Second)
        fmt.Println("worker", id, "finished job", j)
        results <- j * 2
    }
}

func main() {

    const numJobs = 5
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    for a := 1; a <= numJobs; a++ {
        <-results
    }
}

为了根据您的问题进行调整,worker 将处理请求,主 goroutine 将请求馈送到通道中。通过这种方法,您可以轻松控制同时运行的 goroutine 数量。

对您的情况可能有用的另一个模式是 rate limiting

今天关于《在开始新的例程之前停止一个例程》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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