Проблема с ответом на несколько запросов одновременно - PullRequest
1 голос
/ 16 апреля 2011

Я пытаюсь преобразовать мой HTTP-сервер node.js в Go. Вот что я хочу, чтобы произошло:

У меня есть ресурс, который генерируется периодически (скажем, каждую секунду или около того), и я хочу, чтобы все запросы на этот ресурс ждали до следующего генерирования. Таким образом, клиенты могут опрашивать и гарантированно получать только актуальный ресурс. Я использую web.go , чтобы устранить большую сложность работы HTTP-сервера.

Вот краткая версия моего кода:

package main

import (
    "time"
    "web"
    "fmt"
    vector "container/vector"
)

var listeners vector.Vector;

func resource (ctx *web.Context) {
    c := make(chan int)
    listeners.Push(c)
    go func() {
        <-c
        go func() {
            ctx.WriteString("Cool")
            fmt.Println("Wrote something")
        }()
    }()
}

func resourceLoop() {
    time.Sleep(5 * 1000 * 1000000) // sleep for 5 seconds
    for ; listeners.Len() > 0 ; {
        c := listeners.Pop().(chan int)
        c <- 1
    }

    go resourceLoop()
}

func main() {
    web.Get("/resource", resource)

    go resourceLoop()

    web.Run("localhost:4000")
}

Я ожидаю, что там будет Context.End () или аналогичная функция, но, похоже, ее нет. Я прочитал источник для web.go, но не смог выяснить, где он заканчивал ответ ( web.go : 268 - это место, где вызывается мой ресурс ()). В node.js это тривиально, вы можете вызвать ServerResponse.end ().

Когда я убиваю сервер во время выполнения скрипта в Chrome, я получаю следующий вывод (кажется, что он правильный, за исключением того, что ответ не заканчивается):

4
Cool
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Date: Sat, 16 Apr 2011 00:37:58 GMT
Server: web.go
Transfer-Encoding: chunked

0

Это проблема с фреймворком web.go или я что-то не так делаю? Если это проблема с фреймворком, я подам ему проблему.

Я довольно новичок в Go, так что я могу ошибаться.

1 Ответ

3 голосов
/ 16 апреля 2011

Я никогда не использовал web.go, но кажется, что ваш пример слишком сложен.Зачем вам нужен горутин, чтобы породить горутин?Я бы предположил, что сама среда позаботится о параллелизме и просто напишу это:

func resource (ctx *web.Context, val string) string {
    c := make(chan int)
    listeners.Push(c)
    <-c
    return "Cool"
}

В противном случае, похоже, что он делает именно то, что вы хотите, и вам просто нужно закрыть соединение, если вы действительносделано с этим:

ctx.Close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...