我正在编写一个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
。
- 1 回答
- 0 关注
- 170 浏览
添加回答
举报
0/150
提交
取消