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

我正在编写一个Web服务器,该服务器将请求分发到Go中的进程外程序。我正在使用gob通过管道发送ResponseWriter和Request数据类型。


问题是接收到料滴时,外部过程正在挂起。


更新滴料现已成功发送到外部进程,但是现在外部进程在此阻塞fmt.Fprintf(request.Resp, "Hello")并冻结。


dispreq.go


package dispreq


import (

    "net/http"

)


type DispReq struct {

    Resp    http.ResponseWriter

    Req *http.Request

}

dispatcher.go


package main


import (

    "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 main


import (

    "dispreq"

    "encoding/gob"

    "os"


    "fmt"

)


func main() {

    gobDecoder := gob.NewDecoder(os.Stdin)

    var request dispreq.DispReq

    gobDecoder.Decode(&request)

    fmt.Fprintf(request.Resp, "Hello")

}


拉莫斯之舞
浏览 173回答 1
1回答

慕妹3242003

您应该先开始进程(process.Start()),然后再向其中发送数据(encoder.Encode(&dispreq.DispReq{w, r}))。您可能还需要通过关闭(pipe.Close())或发送一个来冲洗管道\n。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go