0

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

问题是接收 gob 时外部进程挂起。

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

dispreq.go

package dispreq

import (
    "net/http"
)

type DispReq struct {
    Resp    http.ResponseWriter
    Req *http.Request
}

调度员.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)
}

你好.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")
}
4

1 回答 1

2

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

于 2012-10-19T07:26:56.033 回答