登录
首页 >  Golang >  Go问答

限制缓冲通道的大小

来源:stackoverflow

时间:2024-02-20 14:36:20 308浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《限制缓冲通道的大小》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

您好,我编写了这段代码来模拟异步发送电子邮件,但如果我向该服务器发送 500 个并发请求,前 100 个请求将能够将其电子邮件排入通道而不会阻塞,但后续请求将阻塞,直到出现通道中是否有可用空间。这可能会导致我的系统出现瓶颈

package main

import (
    "fmt"
    "net/http"
    "time"
)
var count = 0;

var queue chan int

func sendEmail(){
    for email := range queue {
        time.Sleep(2 * time.Second)
        fmt.Println(email)
    }
}

func main() {
    go sendEmail()

    queue = make(chan int, 100)
    defer close(queue)

    http.ListenAndServe(":5000", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        count++
        queue <- count
        w.Write([]byte("email will be sent shortly"))
    }))
}

那么我可以为通道设置的最大缓冲区大小应该是多少?但同样,如果并发请求数明显大于缓冲区大小,仍然可能导致阻塞。处理这种情况的最佳方法是什么


正确答案


需要明确的是,这并不是 Go 所特有的,只要有队列,这种情况就会发生。在某个时刻,您将耗尽资源,无论是内存还是磁盘(如果队列是持久的)。

您需要决定要做什么以及如何向发送者提供反馈,这称为背压。这是一个很大的话题,例如:

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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