Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >零基础学编程023:用with实现优雅地释放资源

零基础学编程023:用with实现优雅地释放资源

作者头像
申龙斌
发布于 2018-03-06 02:54:04
发布于 2018-03-06 02:54:04
1K00
代码可运行
举报
运行总次数:0
代码可运行

在《零基础学编程022:函数的世界》中我们写了一个函数,通过访问新浪的实时行情服务,得到股票的开盘价。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib.request as req

def price(stock) :
    url = 'http://hq.sinajs.cn/list=' + stock
    with req.urlopen(url) as f :
        hq = f.read().decode('GBK')
        v = hq.split(',')
        return v[1]

新手对 with 的用法不太理解,如果以前学过C#语言,这个with类似于using关键词。先来看看不太好的写法吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib.request as req

def price(stock) :
    url = 'http://hq.sinajs.cn/list=' + stock
    f = req.urlopen(url)   # 尽量不要用这种写法!
    hq = f.read().decode('GBK')
    v = hq.split(',')
    f.close() # 当前面发生异常时,不一定能够执行到这条语句
    return v[1]

上面这段代码没有用 with ... as ... 的写法,而是用赋值语句把req.urlopen(url)赋给了 f,在返回开盘价 return v[1] 之前调用了 f.close() 把网络连接关闭。

在绝大多数情况下,这种代码不会有什么问题。但这里的代码访问了网络,而访问网络会有各种异常情况,比如网卡被禁用、WIFI未连接、无法连接互联网、网络地址无效、代理设置不正确、网络服务器故障、防火墙阻挡等等,这些异常都是编程之前无法完全预料的。

我们调用 urlopen() 打开了一个网络连接,在最后务必要保证把它关闭,即调用close() 函数。但当网络已经发生异常了,此时还未执行到close() 函数,程序就已经异常退出了,所以网络连接可能仍处于打开状态。

一般的小程序,这少量的未关闭的网络连接并不会造成什么麻烦,有时操作系统还会在进程关闭时自动释放这些连接,但如果编写服务端程序时,几秒钟之内就可能产生数千个并发连接,当这种问题积累到一定程度后,程序就会出现莫名其妙的错误,而且这种错误特别难定位。

我在2002年用java写过一个网络信息发布系统,当时有人的代码里没有正确地释放Oracle数据库连接,当正式上线时,几分钟之内产生了数百个未释放的数据库连接,Oralce主数据库差点宕掉,幸好我们及时地把程序摘掉,才避免了一次事故的发生。

所以学习编程时,一定要参考别人的例子代码,尤其是参考官方的例子代码。网上流传的一些核心代码只是为了说明具体的用法,写法上并不规范,也没有加入异常处理的相关代码,而真正产品级的代码,会加上许多边界条件检查、异常判断的语句,从而让产品更加健壮。

小结:

  • with 语句用于保证一些资源(文件、网络连接、数据库等)在发生异常时能够正常地关闭或释放
  • 编程初期就养成良好地编程习惯,将错误扼杀在摇篮里
  • with 语句内部会自动调用close()语句释放网络连接,其背后还有比较复杂的实现机制,以后再说

--- END ---

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 申龙斌的程序人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
零基础学编程028:面向对象编程OOP
在《零基础学编程021:获取股票实时行情数据》一节中,我们想获取6支股票的行情数据,在《零基础学编程022:函数的世界》里我们能够把重复性的代码封装为一个函数price(),以后获得不同的股票行情只需调用函数即可,回顾一下这个函数的代码: def price(stockCode) : url = 'http://hq.sinajs.cn/list=' + stockCode with req.urlopen(url) as f : hq = f.read().decode('
申龙斌
2018/03/06
8780
零基础学编程028:面向对象编程OOP
零基础学编程022:函数的世界
通过《零基础学编程021:获取股票实时行情数据》的学习,我们已经可以取出“谷歌”股票的开盘价,今天我们要取出GAFATA共6支股票的开盘价。 先回顾上次的代码: import urllib.request as req with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) 要获取6支股票行情,那就先找
申龙斌
2018/03/06
7640
零基础学编程022:函数的世界
RAII概念与在Python中的应用
RAII(Resource Acquisition Is Initialization),即资源获取即初始化,是一种设计模式,用于解决资源的获取与初始化的问题,最早在 C++中提出与推广。 在这篇文章我来简单地介绍一下 RAII 的概念,以及在 Python 中的应用。
杜逸先
2023/04/13
7120
RAII概念与在Python中的应用
零基础学编程031:Python与其它语言最不同的一条语法规则
有C或JAVA其它编程语言基础的人可能对Python中的这条语法规则最不适应:Python中的缩进是有语法含义的,它用来表示一个代码块(code block)。这里说的代码块是指函数定义、条件语句、循环语句等等。缩进就是指每行代码最前面的几个空格或TAB制表符,通常是与上一行的冒号一起使用的,例如: # 为了清楚地表示缩进,我把空格都用.表示 def price(stock) : ....url = 'http://hq.sinajs.cn/list=' + stock ....with req.urlop
申龙斌
2018/03/06
2.1K0
零基础学编程031:Python与其它语言最不同的一条语法规则
零基础学编程027:站在巨人的肩膀上
在《零基础学编程021:获取股票实时行情数据》这一节里,我们利用urllib抓取新浪财经中的股票数据,可以取出谷歌股票的开盘价,回顾一下代码: import urllib.request as req with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) 但我们很多时候并不需要也不应该从零开始构建一个程
申龙斌
2018/03/06
8800
零基础学编程027:站在巨人的肩膀上
股票数据API整理
最近在做股票分析系统,数据获取源头成了一大问题,经过仔细的研究发现了很多获取办法,这里整理一下,方便后来者使用。 获取股票数据的源头主要有:数据超市、雅虎、新浪、Google、和讯、搜狐、ChinaStockWebService、东方财富客户端、证券之星、网易财经。 根据最近频繁出现的数据超市,可以无限制获取相关数据,而不再需要使用爬虫等方式获取,这样不仅节省了极大资源,也有利于遍历数据。 列出来相关网站清单,开发者可自行到这些网站查询调用方法。 聚合数据 https://www.juhe.cn/ 百度A
机器学习AI算法工程
2018/03/15
25.9K2
股票数据API整理
获取A股行情数据方法[通俗易懂]
做股票量化分析,获取股票行情数据是第一步,结合网上的信息,和我用过的一些东西,做个总结。以后有新信息,逐步完善。
全栈程序员站长
2022/07/25
8.3K0
零基础学编程021:获取股票实时行情数据
春节期间重写了“笑来投资演练程序1.0版”这个程序,可以每个月自动更新几支股票的行情数据。程序的功能不复杂,但是编程新手想实现它仍有相当的困难。为了短时间内完成主要功能,我使用了最熟悉的C#编程语言,
申龙斌
2018/03/06
2.8K0
零基础学编程021:获取股票实时行情数据
Python高效编程(四)
实际编程和面试都会遇到的典型问题。 图片来源于网络 如何读写文本文件 # python2 s = u'你好' f = open('py2.txt','w') f.write(s.encode('gb
dreamkong
2018/06/21
8500
Python股票实时查看告警工具
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
逝兮诚
2019/10/30
3.1K0
零基础学编程033:字符串的split拆分与join连接
在《零基础学编程021:获取股票实时行情数据》这一节里,我们学了split()函数,可以将一个字符串切开。假设有一个历史行情字符串,信息包括:股票名称、开盘价、最高价、最低价、收盘价、交易量等,用split() 之后可以方便地取出任何一个价格,例如:v[1]就是开盘价。 hq = "谷歌,843.64,847.24,840.8,845.62,779900" v = hq.split(',') print(v) # 输出结果:['谷歌', '843.64', '847.24', '840.8', '845.
申龙斌
2018/03/06
8050
零基础学编程033:字符串的split拆分与join连接
Python量化学习-提取证券数据
不知道公众号有多少读者买基金或者炒股,分享一下如何用python获取证券信息 1、网易财经 import requests from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36' } def parse_url(url):
用户9925864
2022/07/27
9290
Python量化学习-提取证券数据
Python - with 语句
使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源
小菠萝测试笔记
2021/09/29
9920
Python with 语句的深入理解:优雅处理资源管理 @contextmanager
大家都用过 with open() as f 来读写文件,但可能较少去实现自己的 context manager。今天我们就通过几个实用场景,来深入理解这个优雅的语法特性。
Piper破壳
2024/12/16
930
零基础学习爬虫并实战
总第63篇 本篇主要从爬虫是什么、爬虫的一般流程、爬虫各个流程的实现方法、爬虫实例四个方面分享零基础了解爬虫,并进行简单的实战。 在阅读下面之前,我们需要对网页有个基本的了解,知道什么是标签,什么是属性,以及知道标题是放在哪,内容是放在哪,这些关于网站的基础知识。 可查看我前几篇关于网页基础知识的推文: 网页是怎么构成的? 网页的修饰 网页的行为 01|爬虫是什么: 爬虫又叫网页数据抓取,就是通过向浏览器发出请求并得到回应,把回应的内容抓取保存到本地的过程叫做爬虫。 比如,我要获
张俊红
2018/04/11
3.8K6
零基础学习爬虫并实战
用python可以做哪些有趣的事--我:选股票
最近炒股是买什么就跌,一直是亏损哎,哭,作为学过python的人来讲怎么能容忍,之前也炒过股票觉得用阳包阴这样的k线来选出来的股票还不错。于是说做就做,我可以用python来写一个选股的程序。
公众号---人生代码
2019/09/24
3.4K0
用python可以做哪些有趣的事--我:选股票
一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍
–Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库 –urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。 –requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。 –默认安装好python之后,是没有安装requests模块的,需要单独通过pip安装
诡途
2020/10/16
1.4K0
python内置模块之上下文管理contextlib
contextlib模块时关于上下文管理的,在介绍之前需要先介绍一下with语句。 with语句
菲宇
2019/06/13
6500
码农技术炒股之路——抓取股票基本信息、实时交易信息、主力动向信息
        从本节开始,我们开始介绍各个抓取和备份业务。(转载请指明出于breaksoftware的csdn博客)
方亮
2019/01/16
1.1K0
小甲鱼《零基础学习Python》课后笔记(三十三):异常处理——你不可能总是对的2
测试题 0.我们使用什么方法来处理程序中出现的异常? 使用try方法,包括try-except语句和try-finally语句。 ①try-except
小火柴棒
2019/01/11
6530
推荐阅读
相关推荐
零基础学编程028:面向对象编程OOP
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验