0

Goのアウトプロセスプログラムにリクエストを配信するウェブサーバーを書いています。gobを使用してパイプを介してResponseWriterとRequestのデータ型を送信しています。

問題は、ゴブを受け取ったときに外部プロセスがハングしていることです。

UPDATEゴブは外部プロセスに正常に送信されていますが、外部プロセスはでブロックされ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")
}
4

1 に答える 1

2

process.Start()プロセス( )にデータを送信する前に、プロセス()を開始する必要がありますencoder.Encode(&dispreq.DispReq{w, r})pipe.Close()また、パイプを閉じる( )またはを送信してパイプをフラッシュする必要がある場合もあります\n

于 2012-10-19T07:26:56.033 に答える