首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法同时响应多个请求

无法同时响应多个请求
EN

Stack Overflow用户
提问于 2011-04-16 08:45:40
回答 1查看 125关注 0票数 1

我正在尝试将我的node.js HTTP服务器转换为Go。这是我想要发生的事情:

我有一个间歇性生成的资源(大约每秒生成一次),我希望对此资源的所有请求都要等到下一次生成它。这样,客户端就可以轮询并保证只获取最新的资源。我正在使用web.go来降低运行HTTP服务器的复杂性。

以下是我的代码的简要版本:

代码语言:javascript
运行
复制
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中运行脚本时杀死服务器时,我得到了这样的输出(看起来是正确的,除了响应没有结束):

代码语言:javascript
运行
复制
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框架的问题还是我做错了什么?如果框架有问题,我会向他提出问题。

我是个新手,所以我可能完全错了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-16 09:08:33

我从未使用过web.go,但看起来您的示例完全太复杂了。为什么你需要一个goroutine来产生goroutine呢?我假设框架本身会处理并发性,只需编写以下代码:

代码语言:javascript
运行
复制
func resource (ctx *web.Context, val string) string {
    c := make(chan int)
    listeners.Push(c)
    <-c
    return "Cool"
}

否则,它看起来就像是在做你想做的事情,如果你真的做完了,你只需要关闭连接:

代码语言:javascript
运行
复制
ctx.Close()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5683693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档