登录
首页 >  Golang >  Go问答

能否在 http 处理函数中向通道写入数据?

来源:stackoverflow

时间:2024-02-27 10:24:26 248浏览 收藏

你在学习Golang相关的知识吗?本文《能否在 http 处理函数中向通道写入数据?》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我想在发生http请求时将值传递给通道,我得到了以下代码:

package main

import (
    "io"
    "net/http"
    "time"
)

var channel1 chan int

func main() {
    channel1 := make(chan int)
    go func() {
        select {
        case <-channel1:
            fmt.Println("Channel1")
        case <-time.After(time.Second * 100):
            fmt.Println("Timeout")
        }
    }()

    http.HandleFunc("/", handleMain)
    http.ListenAndServe("localhost:8080", nil)
}

func handleMain(w http.ResponseWriter, r *http.Request) {
    channel1 <- 1
    io.WriteString(w, "Hello from a HandleFunc!")
}

当我向“/”发出请求时,通道1 <-1 会冻结,为什么会这样,我怎样才能实现我想要的?


解决方案


是的,这是可能的。需要考虑的一件事是您在通道上发送的数据的生命周期。目前该通道未缓冲,因此发送:

channel1 <- 1

需要接收:

case <-channel1:

这意味着写入将排队并阻塞,直到准备好处理为止。这样做的问题是,一旦发生接收,HTTP 处理程序就会完成,并显示 200,向客户端表明该操作是 OK 并且成功。问题是另一个带有接收的 go 例程可能不完整,因为它与处理程序 goroutine 并发执行。数据的所有权已转移到另一个 goroutine。那么如果其他 goroutine 出错但客户端认为操作已成功完成会发生什么?

如果通道是缓冲的,则这种情况会变得更加明显,其中 http 处理程序 goroutine 立即发送然后返回。此问题有多种解决方案,但如果不加以解决,可能会导致细微的数据丢失和逻辑错误。

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

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