00:00
嗯,我们接着呢,给大家再讲一个应用实例,这个应用实例呢,我感觉就能够解决我们前面的一些问题,这个这个应用实例相对来说。比较综合一点,但是很有意思,我们来看看这个应用实例的要求是什么说要求统计一到这么多个一到20万的数字中,哪些是数数。当然我在实际演示的时候呢,我这调成8万,因为这个20万呢,我这运行估计咱们都该吃中午饭了啊,所以说我不会用20万,我把它调成8万,那么哪些是数数,这个问题在本章开篇其实我已经提出来了,只是没有一直去没有去说这个问题,大家还记得我在幻灯片的第一第一第一句话就是为什么需要这个携程,我是提出概念,当时我写的这么多,哪些是输出。好,现在呢,我们终于来解决它了,就说我有一个呼应的这么一个一一个要求哈,那么分析思路,第一种传统的方法,使用一个循环判断各个数是不是输数即可,这个呢是OK的,各位同学这个肯定是OK的,但是同学们可以想象到,不能够充分发挥我们多核的优势,因为你你只是一个CPU嘛,啪啪啪这种傻乎乎的算很慢,那么现在呢,我们的第二个方案是使用并发或者是并行的,也可能是并发加并行。
01:27
因为你一个CP2多个CPU运行,我们叫并行了,一个CPU它又同时在,比如它有,它有同时在对多个携程进行这个片段化的操作,这个就是并发,就是我们在实际工程中可能是并行加并发的一种模式,明白了好,那么现在呢,我们这样使用这种模式,将统计数数的任务分配给四个先生去做,为什么是四个,而不是其他的,因为我这个CPU呢,我逻辑台的CPU刚好有四颗,我就分配到四科去,这样我就是完整的就是全并行的一种模式啊,如果我写八科的话呢,就是并行加B发。
02:06
带理有意思,好,那么现在呢,我要画出我的分析思路,然后代码实现,各位同学来,同学们我先说一下我的思路,打开我们这个地方啊,同学们看我的思路是什么样子的,注意听讲。好,首先呢,我把要求给各位朋友放到这里来,这是我要干的事。这个是我要干的事,我先将这个字体呢,稍微的放大一点,这是我要干的事开始了啊,嗯,我怎么设计这个,我怎么来玩这个东西呢,这是我的一个思路分析。思路分析,这个很重要啊。这个很重要,那我怎么来做这个事儿呢?怎么来做这个事儿呢?我想这么做啊,同学们。我首先呢,呃,这有一个主线程。这有一个主线程,假设我就画成这个现象了啊,这是一个主线程,好的,那么这个主线程呢,怎么去做这个事情,他说把这些数数。
03:05
统计出来,所以说我先要去设计一个管道。我先要去设计一个管道,但这个管道我取个名字。好,这个管道呢,我就把它叫做这个管道,起个名字叫interch啊,或者number都行,我叫interch吧,习惯了interch。这是我的一个管道。那这个管道干什么呢?这个管道就往里面扔一到20万的书,干脆为了好念呢,我就8000吧,啊,因为20万练起来太费劲了,这个地方我专门放这个数的,那怎么放呢?我会启动一个携程。我会启动一个携程,好,假设在我们运行中,这有一个上下文,一个P。好,这有一个P,好,当这个P这个P的时候呢,我们启动一个斜程,那这个P可能上下文比较比较大啊,就这它会启动一个斜程,把这个稍微拉大一点。
04:05
好启动一个写程,那我这就这样子说。好,从这里我启动一个携程,这个携程我姑且就叫一个很经典的名字,叫put number。Put number,这是个斜程,好,待会呢是这样子的,我在这个上下文这里,我在这里撑出去了一个携程,或者说我创建了一个携程。那么这个携程干什么事呢?这个携程他负责一件事情,把数据扔到我们的这一个。这个China里面去,这是他的任务,他往里面写东西,那写什么呢?他就把这个一到8000的数据写进去。一到八期的数据写进去,好,这是他要干的事,好但是我这个我这个圈称呢,我可我估计我开这么大就可以了,我不开大了啊,我就开1000个容量开1000个,我故意这样写,我不开8000,我也不开20万,我就开小一点,因为我想让它流动起来。
05:08
好,那第二个呢,你有往里面放的,哎,人家是要求数数了,所以说呢,你应该还要请四个携程去完成这个统计数数的任务,于是乎我在这里面还会启动四个。别的这个写生这个名字,我们姑且叫做什么呢?数数它的单词是prime。Prime prime number,注意这个单词啊,同学们注意听这个prime就是数数的意思,大家可以查一下这个英文prime就是我统计数数,那这地方我要起几个携程呢?各位PRIME01,这是第一个携程一,我一共要起四个。我一共起四个好,同学们为了省事,我就直接写了四啊,中间还有两个我没写,大家应该能看懂好,那么在这个上下文的时候呢,我也把这四个,我也把这四个去统计数数的,携程干什么启动起来。
06:07
OK,听我说,我把它启动起来,好的,这个呢,又是一个啊,但一共有四个啊,说老师你画了两个,这一一到四你们还看不懂吗?好,那么这个时候我要干什么事呢?各位朋友,我要从这个地方不停的取。OK。我要不停的取,那么怎么取,肯定是通过管道的取的机制取出来。好取,那取的时候你一边取一边就要去统计了,说它不停的取,它的任务是取出这个数,并第二件事并统计。并计算,并计算是否为输数。是否为叔叔好,他的任务呢,其实就是这这这这个任务啊,他的任务就是这个任务好取出并统计是不是数数。
07:00
好,问题来了,说老师如果为数数怎么办呢?你再把它放到另外一个管道里面去。那那说老师为什么不放这呢?你你放这不混在一起了吗?你本身这个地方是产生数据去读数据的,你又把它放进去,那不死定了,所以说我们应该分析出来,我们应该还有一个管道,OK,那这个管道呢,我们姑且把它叫做result。啊,我再取一个管道,这个管道呢,我们取个名字叫result。这个管道的数据量一定要比较大。因为为什么你我们将来会把这个结果就是是数数的,是数数的这个管道,那你也可以叫这个名字叫prime。P管道就是这里面就放的真的就是数数了啊,这个数数开多大呢?这个呢,呃。就看你的经验。这个这个地方,这个地方的结果必须它的容量,就是它的容量必须要真实的体现出你一到8000个有多少输出,看小来不行。
08:05
太小了放不进去啊,太小了放不进去,那么我们姑且放1万个。啊,当然有同学说老师我们能不能,我们能不能这样干呢,说老师我们能不能给它开小1.1点点读呢,后面再说油画,我们先把它增大一点,好增大一点,那你现在不好估算了,我我觉得我我这8000个,我给他放8000个,应该放1000个应该也够了啊。应应该也够了,一到8000的数数应该不会超过1000个了。啊,应应该不会超过1000个,好,这个呢,我们先先写,先保险一点吧,写2000个。好,那也就是说他做完这个度,他如果发现是数数,他还有个任务他要写进去。他要把它写进去哦,因为你统计出来发现它是一个数数,你当然要把它写进去吗?好,它写进去。好。好,问题来了,最大的问题在这里,我怎么知道什么时候写完?
09:05
我怎么知道什么时候写完呢?好,杜位学姐,因为他在不停的往这就说我这个prime number,这个携程,其实他在不停的从这个管道里面取东西,它总有取完的时候。那么你怎么知道它取完了呢?没问题,大家知不知道我这放完了过后,其实我是要把它关闭的。就说我把这个。就说我这个放完这放完8000个数据过后,就说他不是在做循环放吗?最后他会退出来,它会退出来,他退出来的时候呢,就是我会我会干什么呢?我会关闭它,所以说你在这取的时候取取的时候其实它是一个负循环在取。同样这边呢,也是负循环的区,好它总会退出来,那退出来哪一个退出来。才算这个事完了呢,这就是我跟那个小夏他们的一个思路不一样了,我是这样做的啊,同学们。
10:04
小夏,还有那个小鹏。他们是判断。好像他们是判的这个结果,是不是搞定了再退出来的是吧。其实这样子呢,效率不能充分发挥。为什么这么说呢?因为有有可能这个结果,你就是有一个携程,他可能把一些事情做完了,但是因为另外一个携程没有做完这个事儿,你你还在这儿,你还在让他不能不能退出这个学生,还这工作,所以说呢,我的机制是这样子的,咱们可以考虑做这样一个机制啊,我可以这样干。我再写一个写一个。写一个这个管道,这个管道的名字呢?当然每个人的名字叫法不一样,我姑且把它叫做这个管道,我姑且取个名字叫做退出。退出这个携程,当然这是我目前一个简单思路啊,我这个携程呢,开四个。我就开四个叫退出这么一个管道,当他做完这个事情过后,就说这个prime prime。
11:05
那这人不停的不停的去去做这个工作,他总有总有一个时间会。取不到东西。他他不停的在取嘛,它总有一个时间,他取不到,取不到怎么办呢?我就向这个地方扔进去一个数据。我我在这里面写一个东西,就说我说哎,这地方我我有一个值了啊,比如说我放进去一个处。啊,放进一个数,说我完成了,说我我已经完成了,好一旦他完成这个携程就可以。退出来了。就是我完成了,我不管你完没完成,我不管就说我我的任务已经完成了,我就我就往这个退出这个通道里面写一个东西,我就走了。那么这边呢,也是一样的道理,如果他完成了呢,他也往里面写个东西,写个就完成了,好最后同学们。最后,最后大家知道,如果四个prime number都完成,那么这里面应该有四个。
12:03
出。那这样有什么好处呢?这样的好处就是说我们携程之间啊,就说我将来这个行程假设很多,我不用去判断你们是不是都做完了,我才退出我自己,我我把我的事做完了,我就走人。啊,我就告诉这个管道说我已经完成了,那我就不工作了,因为你将来这个每个携程做的事情不一定是完全同步的,比大家都写着学着这个携程他做完事情他就走了,结果你还必须判断,诶人家有没做完我才退出,这个是不合理的。就是我做完了过后,我就往一个往一个管上说我做完了,拜拜。对吧,我不用去说,哎,你又没有做完,你如果你没做完,我也不能退。我这傻乎,在这判断你是不是等于一个字不是这样子的,我做完了,我就给他说我做完了啊,我走了,这个呢,也是这样子的,我做完了啊,我走了。对。那也就是说到这个做完了以后呢,这个退出这个管道里面其实应该有四个T,好,那么最关键的问题就是说,你必须要保证上面的工作全部做完,我们这个主线程才能退出,是不是那主线程大家想它的退出呢,这边一定会有一个负循环,他干一件什么事呢?他就做一件事情,他去不停的read他。
13:23
他从这里面去。他到这面取东西。就说我从这个管道里面取东西,我只要能保证我取出了。四个T。就是我我的取出四个T,就说明你整个全部都做完了,你这边也做完了,这边也做完了,因为我的退出是依赖于这个管道有没有去玩,而我的退出是依赖于你们是不是都在里面写了一个标志,所以说是一个互相依赖的关系,这就完事了,我的思路就这样子的。好,大家看听懂没有,也就是说这种思路呢,他他有个好的意思就是说。
14:02
我们不需要这,这就是他们,携程之间的退出不依赖于他们,互相不依赖。我,我不能依赖于你,你也不要有,我们做完了过我往里面写东西,我就走了,好,这是我的思路,那同学们,现在老师呢,说了什么的东西,我必须将其实现啊,所以说老师呢,花了点时间说思路啊,我还是一直强调思路的重要性啊,思路重要性,那同学们。我讲完这个思路过后,同学们可以扩展,就说诶,哦,原来还有这样一种机制,那么你你们就可以扩展自己的思维,说哎,将来遇到这个情况,我怎么去处理,你你不能说韩老师讲一个方法,诶我就全部用这个方法,也可以适当的扩展来吧,那现在我们不废话了,直接将其实现来开始写东西了啊,这是我的一个思路。应该是说的还比较清楚了啊,那现在呢,就是我们的代码。好,还是老话一句,写编程呢,永远都在做一件事情,什么思路,一个线,然后实现啊,永远在做这个事情。
15:06
永远我们在做的就是这个事,好是啊,那么我们的这一个要求,哎,同学们需求是这样子的,对吧?好,我们已经完成到了这个位置。来,先把需求给同学们。描出来。这是我要做的事儿。对的,这是我分析的思路,思路里边呢,我已经画成了我的思路分析图。好的,呃,然后呢,代码实现,现在开始,这是我的代码啊,思路分析图,下面呢,我们就走一个代码实现。好,各位朋友,现在呢,我们就开始玩了啊。好,有了思路,有了思路。有了思路,那么下面就是代码。代码实现来,其实代码实现很很快就有了,这个思路的话呢,我基本上啊,也就最多就就最多五分钟代码就写完了,好,我们先截取一段视频吧,这个思路分析先就截取段视频。
我来说两句