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

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

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

在《零基础学编程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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WPF窗体透明控件不透明实例
最近在做一个大屏展示视频图片的项目,功能并不复杂,半天的工作量吧,一开始同事采用的Unity3D进行开发,但是里面要播放4K视频,Unity 的短板就是视频的播放了,今晚就要交付了,我一早就来公司,决定用WPF重新开发一版,各项功能都好了,唯独顶部总是显示一条白色的边,已经设置WindowStyle为None了也没用,幸得网上大神提供的资料,终于解决了这个小问题。
zls365
2020/12/15
2.3K0
WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)
在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None"、AllowsTransparency="True" 这两个属性。如果不想自定义窗口样式,还需要设置 Background="Transparent"。这样的设置会让窗口变成 Layered Window,WPF 在这种类型窗口上的渲染性能是非常糟糕的。
walterlv
2023/10/22
1.8K0
WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)
WPF 按钮 Button 的 IsEnabled 属性对 WindowChrome 的 IsHitTestVisibleInChrome 的影响
在 WPF 里面,默认标题栏的交互相对复杂,如按钮没有设置 WindowChrome.IsHitTestVisibleInChrome 属性为 True 那按钮是拿不到点击事件的。本文来告诉大家按钮 Button 的 IsEnabled 属性对 WindowChrome 的 IsHitTestVisibleInChrome 的影响
林德熙
2020/12/21
1.7K0
修复 WPF 窗口在启动期间短暂的白底显示
2017-11-03 15:08
walterlv
2018/09/18
2.6K0
修复 WPF 窗口在启动期间短暂的白底显示
使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光
本文想要做的,可不是随便弄一点阳光的半透明形状,然后简单地放到桌面上,而是真真正正地要照亮桌面上的窗口元素!并且,全程使用 GPU 加速,而且代码超简单。
walterlv
2023/10/23
5640
使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光
WPF中图片剪裁并显示
XAML: <Window x:Class="WpfApp6.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
zls365
2020/12/29
1.1K0
WPF中图片剪裁并显示
WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
发布于 2018-07-12 07:57 更新于 2018-09-05 05:46
walterlv
2018/09/18
6.8K0
WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
在 Windows 10 上为 WPF 窗口添加模糊特效(就像开始菜单和操作中心那样)
发布于 2017-10-01 16:14 更新于 2018-02-19 22:31
walterlv
2018/09/18
5.4K1
在 Windows 10 上为 WPF 窗口添加模糊特效(就像开始菜单和操作中心那样)
使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等)
Windows 系统中有一个没什么文档的 API,SetWindowCompositionAttribute,可以允许应用的开发者将自己窗口中的内容渲染与窗口进行组合。这可以实现很多系统中预设的窗口特效,比如 Windows 7 的毛玻璃特效,Windows 8/10 的前景色特效,Windows 10 的模糊特效,以及 Windows 10 1709 的亚克力(Acrylic)特效。而且这些组合都发生在 dwm 进程中,不会额外占用应用程序的渲染性能。
walterlv
2023/10/22
1.7K0
使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等)
.NET6三分钟搭建WPF三维应用
要运行本文中的示例,请先安装Vistual Studio 2022,社区版就可以了。
郑子铭
2023/12/19
2790
.NET6三分钟搭建WPF三维应用
C#WPF基础02
可分为普通菜单(Menu)和上下文菜单(ContextMenu俗称右键菜单),Menu下可以放Menuitems,Menuitem下又可以放Menuitem。
Echo_Wish
2023/11/30
1760
C# WPF资源使用入门实例
1. 添加两个textbox,第一个textbox从XMAL资源中获取字符串,第二个textbox从C#中获取资源
zls365
2020/12/29
1K0
C# WPF资源使用入门实例
WPF / Windows Forms 检测窗口在哪个屏幕
使用 Windows Forms 自带的 System.Windows.Forms.Screen 类可以从一个窗口句柄获取到对应的屏幕。随后可以使用此 Screen 类获取各种屏幕信息。
walterlv
2023/10/22
4790
WPF / Windows Forms 检测窗口在哪个屏幕
WPF DataGrid 直接绑定数据
初学WPF 以前用的Winform中的 DatagridView就是直接绑定Datasource 就ok了
zls365
2020/12/15
3.7K0
Windows 10 应用创建模糊背景窗口的三种方法
发布于 2018-07-16 11:44 更新于 2018-08-31 23:59
walterlv
2018/09/18
3K0
Windows 10 应用创建模糊背景窗口的三种方法
C# WPF基础之Timer
。WPF性能跟WinForm没得比,只是可以做出漂亮的界面, , 我推荐几个入门教程吧.。首先WPF常规开发都是用MVVM模式,MVVM的框架这里推荐MVVMLight,直接NuGet安装即可, 下边是推荐的链接 这个是视频教程,如果没权限下载直接百度搜索就能找到免费下载的 https://www.cnblogs.com/prism/archive/2011/12/15/2288309.html 这个是WPF各种布局入门 http://www.cnblogs.com/zhili/p/WPFLayout.html
zls365
2020/08/19
1.1K0
C# WPF基础之Timer
WPF旋转板栈设计一例
项目中需要做一个机台的平面视图,点击其中一个料盒时,弹出该料盒的料管列表,用WPF示例做了一下,效果如下:
DotNet Whisperer
2025/04/13
550
WPF旋转板栈设计一例
WPF 设置 ShowInTaskbar 对窗口最小化的影响
在 WPF 中,如果设置了 ShowInTaskbar 为 False 那么窗口将不会在任务栏显示。此时如果设置窗口最小化,那么窗口将会收起来作为没有任务栏时的显示方法
林德熙
2021/03/23
1.3K0
WPF 设置 ShowInTaskbar 对窗口最小化的影响
.NET CORE(C#) WPF亚克力窗体
使用 .Net Core 3.1 创建名为 “AcrylicWindow” 的WPF模板项目,添加三个Nuget库:MaterialDesignThemes、MaterialDesignColors和FluentWPF,其中亚克力效果是由FluentWPF控件库实现的。
沙漠尽头的狼
2020/01/16
2.3K0
WPF MVVM实例三
WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。
zls365
2021/02/26
8660
推荐阅读
相关推荐
WPF窗体透明控件不透明实例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验