douan3019 2015-04-14 21:55
浏览 63
已采纳

Golang,在处理HTTP请求时无法将值推送到“全局”渠道

Currently I am working on an application that can take anywhere from a few seconds to 1 hour + to process. Because of this using a channel to block requests while others are processing seems like a good fit. The following is an example of what Im trying to accomplish, however I am having an issue as it seems like my program is stalling when trying to add data into said channel (see below).

package main

import (
    "net/http"

    "github.com/gorilla/mux"
)

type Request struct {
    Id string
}

func ConstructRequest(id string) Request {
    return Request{Id: id}
}

var requestChannel chan Request // <- Create var for channel

func init() {
    r := mux.NewRouter()
    r.HandleFunc("/request/{id:[0-9]+}", ProcessRequest).Methods("GET")
    http.Handle("/", r)
}

func main() {
    // start server
    http.ListenAndServe(":4000", nil)

    requestChannel = make(chan Request) // <- Make channel and assign to var

    go func() {
        for {
            request, ok := <-requestChannel

            if !ok{
                return
            }

            fmt.Println(request.Id)
        }
    }()

}

func ProcessRequest(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)

    newRequest := api.ConstructRequest(params["id"])

    requestChannel <- newRequest // <- it is stopping here, not adding the value to the channel

    w.Write([]byte("Received request"))
}
  • 写回答

1条回答 默认 最新

  • doutongxuan1614 2015-04-14 22:06
    关注

    Your channel is not initialised and, per specification, send on a nil channel blocks forever. This is because http.ListenAndServe is a blocking operation, so neither requestChannel = make(chan Request) nor your go func() is being called.

    Moving http.ListenAndServe to the end of the main block should fix the problem.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟