为了账号安全,请及时绑定邮箱和手机立即绑定

Go:通过管道发送gob挂起-更新:进程外http.ResponseWriter正在阻止

Go:通过管道发送gob挂起-更新:进程外http.ResponseWriter正在阻止

Go
拉莫斯之舞 2021-04-28 21:13:55
我正在编写一个Web服务器,该服务器将请求分发到Go中的进程外程序。我正在使用gob通过管道发送ResponseWriter和Request数据类型。问题是接收到料滴时,外部过程正在挂起。更新滴料现已成功发送到外部进程,但是现在外部进程在此阻塞fmt.Fprintf(request.Resp, "Hello")并冻结。dispreq.gopackage dispreqimport (    "net/http")type DispReq struct {    Resp    http.ResponseWriter    Req *http.Request}dispatcher.gopackage mainimport (    "encoding/gob"    "fmt"    "net/http"    "os"    "os/exec"    "dispreq")func dispatch(w http.ResponseWriter, r *http.Request) {    process := exec.Command("./hello")    pipe, piperr := process.StdinPipe()    if piperr != nil {        fmt.Fprintf(os.Stderr, piperr.Error())        return    }    encoder := gob.NewEncoder(pipe)    process.Stdout = os.Stdout    //UPDATE: encoder.Encode(&dispreq.DispReq{w, r})    //UPDATE: process.Start()    process.Start()    encoder.Encode(&dispreq.DispReq{w, r})    pipe.Close()    process.Wait()}func main() {    http.HandleFunc("/", dispatch)    http.ListenAndServe(":8080", nil)}你好package mainimport (    "dispreq"    "encoding/gob"    "os"    "fmt")func main() {    gobDecoder := gob.NewDecoder(os.Stdin)    var request dispreq.DispReq    gobDecoder.Decode(&request)    fmt.Fprintf(request.Resp, "Hello")}
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您应该先开始进程(process.Start()),然后再向其中发送数据(encoder.Encode(&dispreq.DispReq{w, r}))。您可能还需要通过关闭(pipe.Close())或发送一个来冲洗管道\n


查看完整回答
反对 回复 2021-05-17
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信