Go: отправка gob'ов по каналу зависла - ОБНОВЛЕНИЕ: внепроцессный http.ResponseWriter блокируется

Я пишу веб-сервер, который распределяет запросы к внепроцессным программам в Go. Я отправляю типы данных ResponseWriter и Request через Pipes, используя gob.

Проблема в том, что внешний процесс зависает при получении гоба.

ОБНОВЛЕНИЕ Теперь gob успешно отправляется внешнему процессу, но теперь внешний процесс блокируется на fmt.Fprintf(request.Resp, "Hello") и там зависает.

dispreq.go

package dispreq

import (
    "net/http"
)

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

диспетчер.го

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

person user489481    schedule 19.10.2012    source источник


Ответы (1)


Вы должны запустить процесс (process.Start()) перед отправкой в ​​него данных (encoder.Encode(&dispreq.DispReq{w, r})). Вам также может понадобиться очистить канал, закрыв его (pipe.Close()) или отправив сообщение \n.

person simonmenke    schedule 19.10.2012
comment
Это была проблема, спасибо. Но теперь у меня возникла новая проблема: hello.go блокируется на fmt.Fprintf(request.Resp, Hello). Нельзя ли передать ResponseWriter отдельному процессу? - person user489481; 19.10.2012
comment
Это связано с тем, что encoding/gob не может кодировать файловые дескрипторы (документация здесь) - person simonmenke; 19.10.2012