返回介绍

12.10.3 设置超时的另外一种方法

发布于 2024-08-14 12:50:31 字数 3324 浏览 0 评论 0 收藏 0

这小节将介绍另外一种从客户端处理 HTTP 连接超时的方法。如您所见,这是最简单的超时处理形式,因为您只需要定义一个 http.Client 对象并设置它的 Timeout 字段为期望的超时值。

展示最后一种超时类型的程序命名为 anotherTimeOut.go,并分为四个部分来介绍。

anotherTimeOut.go的第一部分如下:

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
    "strconv"
    "time"
)

var timeout = time.Duration(time.Second)

anotherTimeOut.go 的第二部分代码如下:

func main() {
    if len(os.Args) == 1 {
        fmt.Println("Please provide a URL")
        return
    }

    if len(os.Args) == 3 {
        temp, err := strconv.Atoi(os.Args[2])
        if err != nil {
            fmt.Println("Using Default Timeout!")
        } else {
            timeout = time.Duration(time.Duration(temp) * time.Second)
        }
    }

    URL := os.Args[1]

anotherTimeOut.go 的第三部分代码如下:

    client := http.Client{
        Timeout: timeout,
    }
    client.Get(URL)

这是使用 http.Client 变量的 Timeout 字段定义超时周期的地方。

anotherTimeOut.go 的最后一段代码如下:

    data, err := client.Get(URL)
    if err != nil {
        fmt.Println(err)
        return
    } else {
        defer data.Body.Close()
        _, err := io.Copy(os.Stdout, data.Body)
        if err != nil {
            fmt.Println(err)
            return
        }
    }
}

执行 anotherTimeOut.go 并和在第十章(Go 并发-进阶讨论)开发的 slowWWW.go web 服务器交互,将产生如下输出:

$ go run anotherTimeOut.go http://localhost:8001
Get http://localhost:8001: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
$ go run anotherTimeOut.go http://localhost:8001 15
Serving: /
Delay: 8

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文