Go:在管道上发送gob已挂起 - 更新:进程外http.ResponseWriter正在阻塞

时间:2012-10-19 06:27:03

标签: go gob

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

问题是接收采空区时外部进程悬空。

更新 gob现在已成功发送到外部进程,但现在外部进程在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)
}

hello.go

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")
}

1 个答案:

答案 0 :(得分:2)

您应该在向其发送数据(process.Start())之前启动该过程(encoder.Encode(&dispreq.DispReq{w, r}))。您可能还需要关闭管道(pipe.Close())或发送\n