源码探索—【go 线程池】ants笔记 1 (真正的小白学源码)

|▌冷眼眸甩不掉的悲伤 提交于 2020-10-17 02:42:13

首次编辑时间:2020年5月23日

项目选择

关于开源项目或者源码学习,对于我们从事IT行业的同道人或者程序员们都是难以避开的一个话题。这里就来记录一下笔者对于开源项目学习的心得以及体会,此过程中由于没有前导师傅且是一个人的学习,所以思考以及叙述过程有所偏颇,还请观者见谅,还希望能够通过留言或者私信等方式不吝赐教~~

笔者属于不聪明但是愿意花时间的“耕牛型”学习者,有时候习惯思考问题找到一个解决办法就好,先用着;对于“源码学习”这个话题,在网上(百度,知乎,以及一些更知名的程序员交流网站均有查阅)并没有找到笔者想要了解的知识,无奈只能硬着头皮上了,摸着石头过河呗,还能咋办嘛 =_=

笔者先记录一下第一个开源项目的确定过程,众所周知,GitHub是一个很大的开源仓储库,其作用也远远不止存放代码,且借着现下多媒体信息盛行的大好时光,开始筛选信息:

  1. 在手机公众号端关注了主要发布GitHub信息的公众号“GitHub精选”。在经过推荐并根据自身情况筛选后确定了目前正在学习的开源项目ants;
  2. 将源码下载到本地,IDE选择了GoLandVSCode也很强大,但是对笔者来说并不容易上手,,新手可以自行适配);
  3. 每天或每两天的下午拿出1-2小时来研读代码;

ants项目的优势在于书写语言go以及其项目体量小(总体代码量2,000行左右),通过公众号的介绍就“入了坑”,笔者在此之前并没有学习过go语言,只是有一些java, python等语言的基础,但是也是发挥了自己的“牛拙劲”,确定下来就啃吧!(这里对ants项目就不做介绍了,感兴趣的小伙伴点一下连接就可以直接访问其GitHub仓库哦~)

这里也给出我学习go观看的网站golangbot以及书本《The Go Programming Language》(后面会给出资源获取链接)。

初期的迷惑

虽然看到笔者账号码龄已经7年了,但是一直是近两年才开始陆陆续续写一些文章,一直没有用心去经营,也是开窍晚的原因吧,哈哈哈~

GitHub对笔者来说一直是一个陌生又熟悉的名词,且知道自身应该去学习以及应用它,源码学习计划启动后也不得不像CSDN这般开始经营起来。

迷惑点1:代码文件的逻辑?

在看到ants的GitHub界面后,除了看到首页中的README.md中的逻辑性之外,其它的都是一头雾水··· 不知道文件与文件之间的关系,以及main()函数在哪里或者驱动函数文件在哪里???
在这里插入图片描述
图1 ants开源线程池项目的README.MD截图

迷惑点1的解决:
在一边学习语言,一遍看源码的过程中,慢慢捋出了简单的逻辑,这里会在整理后在以后的博客篇章中慢慢给出。
关于开源项目或者源码的逻辑梳理,最好的办法就是看源码,当然有一些解释性文字是更好的,会使得自身学习事半功倍,所以也提醒了笔者在自身总结的时候也要多多的做总结和记录。

迷惑点2:是什么促使了这个项目的诞生

工科生的思维,习惯于问个为什么,尤其是在最近读了一些历史及军事书籍外,更想知道现象之后的深度思考,这些深度思考也是开源代码学习中的宝贵经验。

这里就提出一个问题,可以一起来思考一下:是现有了小偷还是先有了警察??,这里在首次编辑(2020.5.23)笔者认为是现有了小偷,这也进一步说明了笔者的思维是认为很多情况下我们是问题驱动的,由于有了小偷,所以在社会秩序以及治安的需求之下,导引了治安体系以及系统的诞生,简单说这个逻辑是这样的哈。(希望以后能自己打脸,慢慢完善自己的思想,哈哈哈哈)

说这么多,就是想探究一下为什么项目的开发者要花时间精力写这么一个线程池?难道go语言中并没有像java那样封装成熟的线程池??截至目前,笔者察觉到的是go语言并不是没有线程池,只是相较于其他更具体系以及生态更成熟甚至工程应用的语言,其线程池性能不够优化,希望以后的学习中能够了解得更深入,更具体,这里先点到为止。

这里再从第二段延伸一下,虽然说问题驱动技术发展是常态,但是能够在问题并未显现情况下,根据现状判断趋势(莫名的有点宏观经济的意思了怎么····),发展或创新技术这是更高的境界,但是这种方式需要有一些先验经验的参考,技术只是从抽象模式到具体的实现。我们程序员在提升自身的过程中会发现,越来越多的是学习其抽象思想,或者模式,能够做到融会贯通,活学活用,遇到问题的时候能够举一反三,充分吸收知识的最终结果就是透过问题表象看到其本质,提出创造性或者根本性的问题解决办法。

迷惑点3:为什么选择了go语言?

其实这个问题有点本末倒置了,正是go中自有的线程相关功能无法完全配适也无需求才有的外围的开发,但是可以从另一个角度来看待这个问题:市场需求以及企业的技术路线:
国内外诸多大厂的后端开发语言很多都转型了go,这里不做一一列举,感兴趣的可以自行查阅(是的,第一版写出来就是懒···)。作为程序员,对于技术趋势的敏感度还是有一定要求的,虽然说越优秀的程序员会渐渐不会去特别关注某个语言且特意去学习,但是相关的语言思想以及变化、还有相关的项目,是值得去总结和花精力去学习的。

笔者在学习过程中,也是感受到了go语言的魅力,截止到目前给笔者的印象就是优雅、简洁,尤其是接口实现和类函数实现形式的变更、defer函数等等一系列(现在给不出严谨的1,2,3来),让笔者初步感受到了它的魅力,目前只能用惊叹两个字来形容,一直也在纠结要不要写几篇关于go语言的,系统总结一下,但是自己又想将时间花在学习路上(有时候还想多看几本书=_=),一直没下决定,所以还是决定目前先完成ants的学习流程,并毕业之后,再调整学习计划吧,时间想要挤总是有的嘛。

进行中的学习历程

这部分需要拓展的具体有:

  1. 进程和线程知识;
  2. 代码实现中,搞清楚线程池的成员设置及逻辑;

这个项目已经说了,是线程池的实现,难以避免地对于一些入门的学习者可能需要学习一些计算机系统的知识,如线程和进程这些基本知识,这里推荐看一下西电的《计算机系统》,这本书是作为研究入学的考试数目,个人觉得很精辟,全篇思维严谨并不会干讲理论,部分结合了实际场景讲解。就算你有相关基础,也推荐你看一下,会有另一番收获。

关于线程池,笔者在学习之前只是大致知晓其运作的简单原理,在项目中并没有应用过,所以对于参数的设置以及逻辑的转换几乎是零基础的状态,所以结合自身的情况,笔者看了一下java的线程池设置,这里直接从参看的JDK8.0ThreadPoolExecutor源码,IDE为NetBeans,关于这部分会单独拿出来讲述,文章比较长,且需要时间梳理(认真写一个帖子真真能耗费几天时间··· 何况笔者一天分有多个时间段分配不同学习任务),目前正在书写中。

笔者认为的源码学习

其实这个项目从开始到现在,已经7个周的时间了,之前预计是一个月能够进行一个较完整的梳理,但是没想到会将战线拉这么长,且拓展的面有点多,也是第一次比较系统的学习开源项目,所以对自己的要求会比较放松,倦怠的时候(比如一个参数搞不清楚为什么设置,以及它的作用)也会几天都不想看代码,而且一个人宅家里太久会导致情绪低落,主动性下降,还是要逼着自己点啊,不要太倦怠了!!

经历了这一段时间,也是有一点点感触:

  1. 首先,笔者认为源码学习最好带着目标,也就是好奇心和探索欲,这样会能够有效抵抗枯燥的代码带来的无力感;
  2. 其次,源码学习最好有算法基础和计算机系统基础,这里的算法基础包括算法和数据结构,计算机基础会让你从性能优化方面更深次地理解为什么这样实现;
  3. 然后,我们需要从问题的角度来看待源码,为什么——它的意义?如何实现——它的技术路线?为什么是这种技术路线——它的设计理由?如何使用——其应用价值及开发潜力?当我们能够将这些问题理解通透,这个项目笔者就认为已经学习到了它的核心思想;
  4. 接下来,学有余力的话最好将项目中涉及到的知识(尽量是关键和核心部分)进行拓展、追溯以及梳理,这部分就如笔者提到的“线程和进程”部分,这个步骤其实是很耗费时间的,且在最初的时候表现越明显,但是随着积累越来越多,这部分会越来越轻松,且更多的是回忆和巩固,甚至是让自身感受到开心的一部分。
  5. 最后,这部分是关于代码重复实现的,觉得没必要的小伙伴可以只关注上面四点。如何直观体现你的掌握情况呢?只有两个字:实践,正如talk is cheap, show me code这句话说得这般,直接上来码两句,就知道深浅了,所以最终能够基本实现核心功能部分,是自己检测的最佳办法,当然书写之后需要自己测试,查看错误和bugs,测试结果与源代码对比,并分析与源代码的差异,查找原因,做好记录。

接下来的更新计划

接下来,主要是有关实际源码的梳理,包括数据结构、设计逻辑等等这些,当然都是笔者的总结,也欢迎大家交流,源码探索会单独设置一个专栏,以后的源码学习也会放到这个专栏来,如本文中提到的ThreadPoolExecutor的源码讲解。

本文提到的学习资源

The Go Programming Language是英文版的,2015年出版,Alan A. A. Donovan等所著。
The Go Programming Language:zilo

计算机系统(西电):3occ

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!