http - 无法同时响应多个请求

标签 http go

我正在尝试将我的 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()

关于http - 无法同时响应多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683693/

相关文章:

python cookielib 错误 :403 Forbidden

HTTP 压缩 - 哪种技术最适合安全性和性能?

go - 如何强制对自定义 Controller 中的 SharedIndexInformer 进行完全重新同步

mongodb - 如何在mongo-driver-go中更新指定数量的文档,就像mysql`update table set filed = dxx limit 50`

Golang 地址运算符和 (*int)(Type) 语法

regex - 如何删除字符串中的空格或制作接受所有类型有效电子邮件的正则表达式

go - 结构上的匿名函数

http - 将应用上传到谷歌应用引擎时出现问题

language-agnostic - 如何响应 RESTful Web 服务中的备用 URI

c# - 为什么 ServerVariables ["HTTP_REFERER"] 跳过一个页面?