时间过得飞快,羽方已经入职半个月了。半个月期间,他的毕业设计已经完成了,论文也已经给导师发过一两次了,现在还在改格式。工作上对于Python也已经有了基本的了解,对于一些简单的程序也能够独自写了。
今天,范平海交给了他一个新的任务,也是第一个真正的使用Python完成一项工程中的需求,那就是黑名单的处理。这是一项很简单的任务,任务的逻辑是这样的,现在公司里有个一个监测系统,系统会把监测到的数据存储在数据库中,然后从数据库中找到违法的数据,查找的办法就是通过字符串匹配,查找到包含黑名单网站域名的URL地址。
现在羽方已经学会了字符串匹配的方法,但是最主要的工作是如何使用这个匹配完成自己想要的功能,这个不是一时半会能够想到的。范平海给了他两天的时间,让他来完成这个工作。
羽方第一次参与到正式的项目中心里很是激动,他积极主动的去查找应该使用什么来进行字符串匹配,使用什么来进行循环判断,如何保证程序不会执行一段时间后自动终止等等。一切都是新的,上面的内容也是范平海告诉他的,让他特别注意一下这些地方。
下午,羽方就写完了第一个版本,他使用了list进行URL列表的管理,然后遍历list,进行黑名单判断,判断完成后,重新从数据库中读取URL数据。当然了,读取数据库的接口是打了桩的,因为他还不会使用数据库。然后他仔细检查了一遍,觉得没有问题了,就发给了范平海查看。
范平海只看了两眼,“你写的代码是正确的,但是性能太低了,这个判断是可以使用多线程来处理的,你这样处理的话会很慢的。然后你的程序没有设置退出和停止循环条件,如果所有的URL地址判断完成以后,会导致死循环,CPU达到100%的。”
多线程羽方还可以理解,虽然没有看到,但是他也知道使用多线程能够使程序的性能更好。可是退出循环是怎么回事?如果退出的话不就不能继续判断了吗?还有CPU怎么可能会达到100%呢?
“范哥,使用多线程我知道了,但是为什么要退出循环啊?还有CPU怎么可能达到100%,还有其他程序在运行啊?”
“不是退出循环,是要有判断条件。你有没有想过我们升级的时候怎么停止程序,这里设置个标志位,如果手动停止了程序,就停止循环。还有,在没有数据的时候不要一直执行循环,要添加sleep代码,让程序睡一下,防止一直占据内核,CPU升高。”
“好的,范哥,我再拿去改改。”
“还有,你还在用ActivePython自带的编辑器是吧?去下载一个Eclipse+pydev吧,这个是目前对Python支持比较好的IDE,写大型工程的话还是要使用IDE,不要总是使用系统自带的编辑器。”
“好的。”羽方回到了工位,脑海里还在想着程序退出循环和CPU使用率升高的问题。他先是到网上下载了范平海说的Eclipse+pydev,然后照着网上的教程进行了对应的设置,就想着把已经写好的代码迁移到eclipse上来。
代码迁移以后,羽方没有开始几个问题的修改,而是又去看电子书了,因为他不知道在Python里面应该如何创建多线程。不过羽方是个聪明的孩子,很快他就找到了创建线程的方法,然后开始从更新编写程序起来。
这一次却不想刚才那么简单了,所有代码写好以后,调试的时候羽方才发现很多数据都进行了多次判断,也就是说虽然效率提升了一点,数据却进行了重复的处理。羽方赶紧上谷妹进行了一下搜索,发现原来是因为自己没有加锁的缘故。在使用多线程时,如果多个线程要访问同一块数据的话,就需要在访问代码的上下添加锁,防止出现同时访问导致不可预知的问题。
“羽方,下班了,一起走吗?”看到了问题解决的希望,羽方就要去修改代码,却听到了何雪的声音。何雪因为学校和羽方不远,这几天都是一起下班的。现在已经到了下班时间,羽方心想就差这一点了,反正明天还有一整天的时间,一定可以完成的。就跟何雪一起下班先回学校了。
第二天,羽方上班以后,首先就修改了昨天发现的问题,也就是加锁的问题。结果发现自己对于Python里面的锁机制也就是Thread。lock根本就不了解,没有办法,他只能再去翻书,当时的羽方还没有使用搜索引擎的习惯,发现了问题想到的第一个办法还是去找教程。等他了解了锁的用法,在修改完代码以后,已经快要中午了。这个时候他赶快再次把代码发给了范平海,希望能够得到指点。这个时候他已经感觉到自己在做实际项目中的进步要比自己独自看书进步快了许多。
“使用多线程是正确的,但是这里加锁的话会多少导致性能下降,根本没有必要的。Python系统里已经定义了一个线程安全的队列是Queue,你还没有看到吗?”范平海看完代码之后说道。
“Queue?队列?这个我还没有看到,我这就去看一下。”羽方说着就准备回去继续修改。
“没事的,你先按顺序慢慢看吧,黑名单的检查代码我已经写好了,一会发给你看看,你看看自己写的哪里有问题。这次项目就算是一个练习吧。”范平海说道,然后发给了羽方一个压缩包。
羽方收到压缩包,打开是黑名单检查的代码,发现有多个文件,是通过模块做的,把不同的功能写到了不同的模块之中,瞬间觉得自己把所有代码写在一起好low。继续看下去,发现范平海会使用的是Queue队列,这样在多线程的时候就不用加锁了,系统已经保证了线程安全,果然比自己使用List要好很多。
虽然范平海已经写完了代码,但是羽方还是根据看完代码后的理解自己又重新把代码写了一遍,他感觉自己这两天学到的东西挺多的,但是一时却又有点消化不了。
晚上回到宿舍,羽方还在回忆着自己这两天的收获,他觉得这将会是自己真正做一个程序员的开始,是一次人生的转变,因为以后他就不再和明哲,董浩一样是一个学生了,而将会是一个有着工作的社会人士。