2019独角兽企业重金招聘Python工程师标准>>>

Go语言作为一个现代化的编程语言以及支持垃圾内存的自动回收特性(GC). 我们现在关注的是非内存资源的自动回收技术.

局部资源的管理

在讨论Go语言解决方案之前, 我们先看看C++是怎么管理资源的.

C++中可以可以自动执行的代码主要是构造函数和析构函数. 因此, 很多资源的管理技术都是基于构造函数和析构函数实现.

比较常见的是C++的RAII(Resource Acquisition Is Initialization)技术, 即初始化中获取资源. 比如在多线程编程中用到的MutexLocker:

struct MutexLock {Mutex *const mu_;MutexLock(Mutex *mu): mu_(mu)  {mu_->Lock();}~MutexLock() {mu_->Unlock();}
};

这样在使用Mutex的时候就不会忘记解锁的操作了:

void* safeRead(Mutex *mu) {MutexLock locker(mu);if(...) {return NULL;}return read();
}

其实RAII中最重要的是退出locker作用域是自动执行对象的析构函数, 这里也就是mu_->Unlock();语句.

C++的构造函数其实是次要的. 关于禁用C++构造函数的讨论可以参考我的 另一个文章: C++去掉构造函数会怎么样?

因为构造函数经常是通过显示定义变量而隐式调用的, 因此用普通的全局函数也 可以实现构造函数的功能(唯一的约束是值容器). 其实C语言的fopen就是一个FILE对象的构造函数.

而作为C语言简约哲学继承者的Go语言同样也没有对构造函数做特殊处理. 在Go语言中构造函数这是约定以New开头的普通函数, 比如NewBuffer.

Go语言/UNIX之父Ken Thompson发明了defer语句, 完美地 解决了析构函数的问题(defer还有很多其他特性).

因此, 在释放局部资源时, 可以用defer管理. 因为C++的RAII的构造 函数和析构函数耦合过于紧密, 对于资源申请失败的问题就比较麻烦. 但是Go语言的defer则灵活很多.

比如, Go语言版本基于deferMutex用法

func safeRead(Mutex *mu) []byte {mu.Lock()defer mu.Unlock()return read();
}

对于可能申请失败的资源也很好处理:

func loadFile(name string) ([]byte, error) {f, err := os.Open(name)if err != nil {return nil, err}defer f.Close()return load(f)
}

使用defer语句, 可以方便地组合函数/闭包和资源对象. 即使panic时, defer也能保证资源的正确释放.

非局部资源的管理

我们之前看到的都是在局部使用和释放资源. 如果资源的生命周期很长, 而且可能被多个模块共享和随意传递的话, defer语句就不好处理了.

解决的思路和C++的RAII的方式类似: 我们需要一个能够自己定义的类似 析构函数的技术.

但是因为Go语言有GC特性, 因此没有析构函数的概念. 不过runtime包的 func SetFinalizer(x, f interface{})函数可以提供类似的机制.

比如, 我们可以包装一个文件对象, 在没有人使用的时候能够自动关闭:

type MyFile struct {f *os.File
}func NewFile(name string) (*MyFile, error) {f, err := os.Open(name)if err != nil {return nil, err}runtime.SetFinalizer(f, f.Close)return &MyFile{f:f}, nil
}
func (f *MyFile) Close() {f.f.Close()
}

在使用runtime.SetFinalizer时, 需要注意的地方是尽量要用指针访问 内部资源. 这样的话, 即使*MyFile对象忘记释放, 或者是被别的对象无意中覆盖, 也可以保证内部的文件资源可以正确释放.

总结

Go语言是短小精悍的语言, 它的设计哲学来自UNIX和C语言的KISS原则. 但是Go语言的语法规范虽然很少(50+页), 但是却提供了无限可能的组合方式.

Go语言之父Rob Pike有篇文章叫 少是指数级的多. 但是为什么少就是多呢?

参考下数学公理就明白了: 数学的基础规则是很简单的, 但是组合方式却是无穷的. Go语言的思路也是提供虽然少但却是正交的基础特性, 通过不同特性的无穷的 组合方式来应对各种问题(一个反例就是C++的构造函数和析构函数).

这里我们主要是基于Go语言的deferruntime.SetFinalizer两个基础特性, 来解决资源的自动回收问题.


https://chai2010.cn/

转载于:https://my.oschina.net/chai2010/blog/161797

Go语言资源自动回收技术相关推荐

  1. 11项重大发布!百度大脑语言与知识技术峰会全程高能

    AI正在向更深层次进化,语言与知识技术的重要性愈加凸显. 8月25日,以"掌握知识.理解语言.拥有智能"为主题的百度大脑语言与知识技术峰会重磅开启,百度CTO王海峰发表主旨演讲,解 ...

  2. 真全!GitHub上出现了一个353种语言资源的汇总

    来源:AI科技评论本文约1200字,建议阅读5分钟随着AI技术的迅猛发展,机器翻译技术的出现让拯救濒危语言成为可能. 据联合国科教文组织统计 世上现存的7000+种语言,超过四百种濒临灭绝 全世界平均 ...

  3. C 语言资源大全中文版

    C 语言资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome:XXX 系列的资源整理.[awesome-c](https://notabug.org/koz.ross/awe ...

  4. 致力语言资源建设、常识推理的自然语言处理螺丝钉

    作者简介 刘焕勇, Liu Huanyong,2017年硕士毕业,目前就职于中国科学院软件研究所,专注金融.情报两大领域,从事事件抽取.事件演化.情感分析.事理(知识)图谱.常识推理.语言资源构建与应 ...

  5. 语言资源的类别、搜索与搭建策略

    语言资源的类别.搜索与搭建策略 一.引言 语言资源,本身是一个宽泛的概念,即语言+资源,语言指的是资源的限定域,资源=资+源,是资料的来源或者汇总,加在一起,也就形成了这样一种界定:任何语言单位形成的 ...

  6. 中文自然语言处理语言资源项目(ChineseNLPcorpus)

    ChineseNLPcorpus An collection of Chinese nlp corpus including basic Chinese syntactic wordset, sema ...

  7. 《C#语言和数据库技术基础》单词必备

    <C#语言和数据库技术基础> 第一章 1..NET Framework   框架 2.sharp            尖锐,强烈的 3.application      应用程序 4.d ...

  8. java语言与java技术

    本文叙述了Java语言的出现背景.主要特点.发展历程以及Java技术的应用,指出Java是当今IT产业和人类文明的创新和希望. 1.Java语言的出现 自从1946年世界上第一台电子计算机问世以来,计 ...

  9. 单片机c语言编程教学大纲,9C语言单片机开发技术教学大纲(16学时)新.doc

    9C语言单片机开发技术教学大纲(16学时)新 <C语言单片机开发技术>课程教学大纲 课程代码:010142061 课程英文名称:Development technology of C la ...

最新文章

  1. swift_009(Swift 类型别名/安全/推断)
  2. 【阿里聚安全·安全周刊】Python库现后门 可窃取用户SSH信息|Facebook再曝300万用户数据泄露...
  3. 正确使用计算机网络,如何正确使用计算机网络
  4. docker kafka互通有问题_Docker搭建kafka集群
  5. 如何解决服装面料纬斜问题
  6. sql 如何把查询得到的结果如何放入一个新表中
  7. JdbcTemplate 的使用
  8. 可能这是Redis可视化工具最全的横向评测
  9. linux基本防护 /病毒检测
  10. No matter what,just do not give up。
  11. 关于Mybatis的深入学习(4)之动态SQL二十四道练习
  12. python爬虫简单入门级,小白讲说
  13. 学 Python 和学 Java ,哪个好找工作?
  14. python3GUI--翻译器-v2.0(附源码)
  15. 网站安全检测 针对于手机短信轰炸漏洞的检测与修复办法
  16. 2015下半年软件测评师上午考试试题
  17. 基于原生JavaScript实现的消消乐小游戏
  18. oracle 级联删除触发器,sql触发器级联删除
  19. php拼接循环拼接字符串数组,PHP数组拼接
  20. softmax回归与交叉熵损失

热门文章

  1. python 哈希表_哈希表哪家强?编程语言找你来帮忙!
  2. 我的车模我做主 - 精美的车模作品
  3. 一种带有柔顺控制算法四自由度自动上样机械臂
  4. 配置腾讯云服务器-2021-3-27
  5. 安装 express4 linux,nodejs+express4.0+mongodb安装方法 for Linux, Mac
  6. linux dns chroot配置文件,linxu chroot DNS 配置
  7. 360 自动打开word_EXCEL的数据和图表如何与ppt,Word关联,看完你就会了
  8. c语言卡尔曼函数库,kalman之c语言实现
  9. php 按钮状态,RPi GPIO状态更新为php按钮和脚本
  10. LINUX应用修改硬件寄存器l,郝健: Linux内存管理学习笔记-第2节课【转】