gpt4 book ai didi

http - 在 http 处理程序中使用 goroutines 和 channel

转载 作者:IT王子 更新时间:2023-10-29 01:43:27 25 4
gpt4 key购买 nike

我实现了一个非常简单的 Twitter 客户端阅读器:

package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"time"
)

type twitterResult struct {
Results []struct {
Text string `json:"text"`
Ids string `json:"id_str"`
Name string `json:"from_user_name"`
Username string `json:"from_user"`
UserId string `json:"from_user_id_str"`
}
}

var (
twitterUrl = "http://search.twitter.com/search.json?q=%23UCL"
pauseDuration = 5 * time.Second
)

func retrieveTweets(c chan<- *twitterResult) {
for {
resp, err := http.Get(twitterUrl)
if err != nil {
log.Fatal(err)
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
r := new(twitterResult) //or &twitterResult{} which returns *twitterResult
err = json.Unmarshal(body, &r)
if err != nil {
log.Fatal(err)
}
c <- r
time.Sleep(pauseDuration)
}

}

func displayTweets(c chan *twitterResult) {
tweets := <-c
for _, v := range tweets.Results {
fmt.Printf("%v:%v\n", v.Username, v.Text)
}

}

func main() {
c := make(chan *twitterResult)
go retrieveTweets(c)
for {
displayTweets(c)
}

}

我现在想为它构建一个简单的 Web 客户端并让它显示 Twitter 结果。但我对在 http 处理程序中调用 goroutines 持谨慎态度。有人指出我正确的方向吗?

最佳答案

在 HTTP 请求的上下文中,您会受到 goroutines 的限制,因为该 HTTP 请求需要响应,而不是“等到稍后”。这里有几个选项:

  1. 使用网络套接字。我从来没有在 Go 中实现过 websocket,所以我没有任何经验,但这确实是让客户端等待数据并在数据进入时显示它的最佳方式。This blog post似乎有一个很好的教程。 (您也可以使用 COMET 框架来实现类似的功能。)

  2. 不要使用 goroutines,而是使用 AJAX 请求来保持客户端的异步性(完全是一个词)。这看起来像是客户端加载您的页面,它向您的服务器发出一堆 AJAX 请求,您可以在多个线程中处理这些请求,因此理论上它们可以在大约同一时间完成。请注意,您可以生成一个 goroutine 来响应特定请求,但该 goroutine 应该完全响应该请求。

  3. 使用 goroutines 向 Twitter API 发出所有请求,但要等待它们全部完成并将它们集中在一起,然后再完成请求并做出响应。这让您的所有 Twitter API 请求同时发生并节省您在后端的时间,但您的客户端在向用户显示任何内容之前仍然必须等待那个时间(最慢的 API 请求)。

如果是我,而且我很赶时间,我会选择选项 2,将繁重的工作留给客户端,同时仅将服务器用作 Twitter API 的基本代理。但选项 1 会是更好的解决方案,尤其是在您不太担心浏览器兼容性的情况下。

关于http - 在 http 处理程序中使用 goroutines 和 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15820046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com