文档章节

golang context 简介(1)--如何避免资源浪费

guonaihong
 guonaihong
发布于 09/26 09:27
字数 594
阅读 35
收藏 1

这个系列主要聊下 context 的出发点,带来了哪些便利的地方,常用 API,以及源代码分析

很多童鞋忽略的问题

API 服务是很多童鞋开发过的套路,从 API 取得数据或者控制字段,查询数据库返回业务数据。 那好,问题来了,如果 http client(curl 或者浏览器)在数据没有返回的过程中,异常中止了。你的 API 服务是不是还在傻傻的查询呢? 先来个伪代码模拟,下面会用 fmt.Printf+time.Sleep 模拟数据库查询操作。

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "time"
)

func main() {

    router := gin.Default()
    router.POST("/", func(c *gin.Context) {

        //模拟操作数据库
        for i := 0; i < 200; i++ {
            fmt.Printf("read db\n")
            time.Sleep(time.Second * 1)
        }
    })  

    router.Run()
}
// curl -X POST 127.0.0.1:8080/
// 你会发现如果客户段 ctrl+c 后,还会不停打印 read db,直到计算器结束。

调研 http.Request 数据结构

上面的资源浪费有没有办法优化?先瞄下 http.Request 源代码。好像有个 context 的东西还挺有意思的。

type Request struct {
    // ctx is either the client or server context. It should only
    // be modified via copying the whole Request using WithContext.
    // It is unexported to prevent people from using Context wrong
    // and mutating the contexts held by callers of the same request.
    ctx context.Context
}

// Context returns the request's context. To change the context, use 
// WithContext.
//
// The returned context is always non-nil; it defaults to the
// background context.
//
// For outgoing client requests, the context controls cancelation.
//
// For incoming server requests, the context is canceled when the
// client's connection closes, the request is canceled (with HTTP/2),
// or when the ServeHTTP method returns.
func (r *Request) Context() context.Context {
    if r.ctx != nil {
        return r.ctx
    }
    return context.Background()
}

改造资源浪费代码

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "time"
)

func main() {

    router := gin.Default()
    router.POST("/", func(c *gin.Context) {

        //模拟操作数据库
        ctx := c.Request.Context()
        for i := 0; i < 200; i++ {
            select {
            case <-ctx.Done(): // 新增加的关键代码
                fmt.Printf("found client ctrl+c\n")
                return
            default:
                fmt.Printf("read db\n")
            }
            time.Sleep(time.Second * 1)
        }
    })

    router.Run()
}

// curl -X POST 127.0.0.1:8080/
// 你会发现如果客户段 ctrl+c 后,已经不打印出来 read db。
ok,完美解决资源浪费的问题。 还有更多玩法,下篇介绍。

我的 github

https://github.com/guonaihong/gout

© 著作权归作者所有

guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
Golang全面深入 - Context

Context简介: Context由Google官方开发,在1.7版本引入, 在Go服务器程序中,每个请求都会有一个goroutine去处理。然而,处理程序往往还需要创建额外的goroutine去访问后端资源,比如数据库...

90design
2018/07/03
2.6K
0
golang Timer Reset方法使用的正确姿势

简述 在golang程序编写的过程中,避免不了对timer的使用,在对它不甚了解的情况 下使用可能会造成对服务器资源的浪费。已有文章对此解释的非常清楚,这里不再赘述,只做强调说明。 那么在调用...

宜技之长
2018/03/03
0
0
go1.7中Context包的正确使用姿势 [译]

@(Golang)[2018-4-15] 视频:https://www.youtube.com/watch?v=-_B5uQ4UGi0 博文:https://medium.com/@cep21/how-to-correctly-use-context-context-in-go-1-7-8f2c0fafdf39 为什么需要 Co......

Markz0928
2018/06/21
107
0
Knative Serving 进阶: Knative Serving SDK 开发实践

作者 阿里云智能事业群技术专家 牛秋霖(冬岛) 导读:通过前面的一系列文章你已经知道如何基于 kubectl 来操作 Knative 的各种资源。但是如果想要在项目中集成 Knative 仅仅使用 kubectl 这...

阿里巴巴云原生
08/30
17
0
Android中常见的内存泄漏问题及解决办法

在android开发中,内存泄漏是比较常见的问题,但为什么会出现内存泄漏呢?当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导...

SilenceOO
2017/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
11
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部