zoukankan      html  css  js  c++  java
  • [GO]conext的使用

    package main
    
    import (
        "context"
        "time"
        "net/http"
        "fmt"
        "io/ioutil"
    )
    
    type Result struct {
        r *http.Response
        err error
    }
    
    func process() {
        ctx,cancel := context.WithTimeout(context.Background(), 2*time.Second)
        defer cancel()
    
        tr := &http.Transport{}
        client := &http.Client{Transport:tr}
        c := make(chan Result, 1)
        req, err := http.NewRequest("GET", "http://google.com", nil)
        if err != nil{
            fmt.Println("http request filed, err:", err)
            return
        }
        go func() {
            resp, err := client.Do(req)
            pack := Result{r:resp, err:err}
            c <- pack
        }()
    
        select {
        case <- ctx.Done()://内部也是一个管道,如果这个管道能够读到数据,说明已经超时了
            tr.CancelRequest(req)//取消正在请求的http请求
            res := <-c
            fmt.Println("timeout!", res.err)
        case res := <-c:
            defer res.r.Body.Close()
            out, _ := ioutil.ReadAll(res.r.Body)
            fmt.Printf("server response:%s", out)
        }
        return
    }
    
    func main() {
        process()
    }

    执行结果 

    timeout! Get http://google.com: net/http: request canceled while waiting for connection
  • 相关阅读:
    单例模式的三种写法
    ASP.NET如何下载大文件
    字符串是引用类型
    SQL 事务隔离级别
    Sql Server 锁
    设非主键为聚集索引
    C#如何使用SqlCacheDependency
    简易系统后台架构
    matlab cross 3*1 向量叉乘
    Matlab求齐次方程的解
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9993798.html
Copyright © 2011-2022 走看看