麻烦同时响应多个请求

| 我正在尝试将node.js HTTP服务器转换为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是我的resource()的调用位置)。在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的新手,所以我可能会完全犯错。     
已邀请:
我从未使用过web.go,但是您的示例似乎过于复杂。为什么需要一个goroutine来生成goroutine?我认为框架本身会照顾并发性,只需编写以下代码:
func resource (ctx *web.Context, val string) string {
    c := make(chan int)
    listeners.Push(c)
    <-c
    return \"Cool\"
}
否则,看起来它确实在执行您想要的操作,并且只需要真正完成就可以关闭连接:
ctx.Close()
    

要回复问题请先登录注册