00:00
好,打开我们的这一个CHAPTER16,我们新建一个文件夹,我们取个名字叫做go啊。Grow的一个应用。Apply apply,这是我们的零三案例,好,我们新建一个文件夹,好新建一个文件main.go好,组代码package package主,然后呢,Import好,Import好,肯定这个有的,然后呢,主函数,主函数好开始玩哈,首先呢,根据刚才我们的思路,我们应该先建三个,三个这个管道出来,这个没问题,非常简单。不要啊,我们就直接这样写了啊,In the,串轴make make,然后呢,我的类型是呃,放整数的大小呢,咱们可以随意,我就放1000个吧啊,1000个放100个也行,放100个也行,因为它只要有毒,它就不会阻塞在这里啊,第二个呢,我们要创创建一个prime,最后这个结果的这个券。
01:06
好,这个呢,我们要稍微大一点啊,稍微大一点,但其实我们后面也可以想把它弄小点,做完了过后直接马上就取出来,放到我们的一个map里面也可以啊,放到一个map里面可以啊,这个地方我们先暂时做大一点啊,给大家一个呃。也来一个1000吧,应该能放进去。应该也能放进去,放2000好,这是放这个结果的,这是放结果的。放结果。放入结果。好了,嗯,有了这两个实路功能呢,第三一个我们还有一个退出的,就是退出的一个管道,就是标识标识退出的一个管道,各位同学好,刚才老师已经分析出来了啊,是退出圈,那么这个时候呢,我们就make一个,呃,Make一个布尔类型的就行啊,当然也可以别的,只要是四个就行啊,四个这个要确定就四个。
02:01
四个啊,因为我们我们目前开的携程呢,就四个对四个,当然有有些同学说老师假设我将来要开10万个,难道这也这样写吗?那当然你要用别的思路来解决,你不能说一一招走遍天下是吧?韩老师讲一个我什么都按这个手套,那你也可以稍微动动脑筋嘛,对不对,你动动脑筋,你你你你四个这个布尔开四个这个,那你可以把这个四个这个不不是布尔是个map不一样的吗?对吧,我们脉部取出来,取它的大小不是一样的吗?对,你要这么去想好这个做完了过后呢,我们来首先开启第一个。我们先开一个开启一个斜程,向哪里呢?向注意听啊,向我们的这个in channel放入数据。对,放入数据哦,我们放入,呃,一到8000这个数,8000这个数。OK,这个很简单,我们呢,可以直接用这个匿名函数写,但是我的习惯呢,哎,我还是单写一个函数好,我单写一个函数。
03:04
这样子呢,习惯啊习惯的,但刚才我们把函数名已经写好了,叫做put number,对number,那你要做的话呢,你首先把这个管道给我传过来。要把管道传过来,现在呢,我们是,诶对这地方应该有一个inr名字应该保持一致,所以管道的它的类型是引用啊,我在我在讲课的时候,开篇名义它是引用,所以说你这这个地方传进去的管道和这个管道是同一个同一个。好的啊,这写错了,对,刚才看到了,好,那么就是一个很简单,一个负循环,对0I小于8000,好的,I加加没问题,我们就快速的把它放进去就行了,怎么放呢?非常简单,就是inter inter,然后往里面扔,呃,扔扔一到8000呢,干脆我们就这样子啊,因为它是一到8000的统计嘛,大地方就写I就可以了。
04:01
好,这样就放进去,放进去完了后这个负循环只要退出啊,只要复出我就关闭它,注意啊,注意听,同学们注意,在你没有关闭之前,其实我们这个我们这几个线程就已经可以开始工作了,注意听啊,不是说你非要关闭人家才能读啊,千万不要这么理解说老师是不是我我在这个primary k,我去读这个inter的时候,人家非要关闭不是。它没有关闭,我可以读,我也可以读,那你关闭了过后,只是说我读到那个标志位的时候,我退出啊,就这一作用而已啊,所以说你会看到他在你你在往里面放的时候,其实我已经开始工作了,那关闭什么呢?关闭我们的in inter。啊in非常的简单,非常简单,Close一下就完事了啊注意你这关闭了就OK了啊,这个事情这个携程就做完了,那也就说你这只要做一件事情,够我们的put number完事。也就是说此时时刻,大家可以想象到这个携程已经开始工作了,那现在呢,我们还要写prime number这个这个携程,来同学们看代码。
05:07
好,我们再来开启四个携程。开启四个携程,当然你也可以开启更多啊,开启四个携程向哪里呢?从啊不是向了,从从这个in inter里面取出数据啊,取出取出数据并判断。并判断判断是否为素数。是否为数数,什么是数数呢?就是说除了一和本身能够整除的,其他都不能整除,这个叫数数,那么如果是,如果是,如果是就放入到,对就放入到哪里去呢?诶放入到我们刚才的那个叫prime这个prime这个插里面去啊郭同学这很快里面去。好,那这段代码呢,我们就从这个地方粘过来,直接在这写一个注释,好,这是我写的第二个函数来走了,那就放,那这个时候呢,我们就prime prime p me prime number OK,那这个时候呢,你必须给我传进来,首先你要告诉我从哪去取。
06:19
这个是必须的,第二个呢,你必须还要做一个动作,你得告诉我,我把这个结果放哪去,所以说你还得把这个P这个管道给我传过来,对不对,好,那这个也简单,Prime。Prime c cn,然后呢,它的类型也是不要忘了还有一点事情,还有什么事,你做完这个事情过后,你是不是还要把你你这自己做完了。你你这个prime取不到的时候,你就自己往这个退出的这个管道里面,你还写个触,所以说呢,他还要传一个东西过来。什么玩意儿呢,就这个这个类型呢,是波尔类型,看清楚了,也就他需要有三个管道。
07:01
它需要有有有三个管道,那么这个时候他怎么怎么玩呢,肯定就是一个for循环去。啊,使用for循环,使用for循环。For循环。好,非常的简单,非常简单,一个负循环从哪里取呢?就从这地方取,先取一个,先取一个数出来,比如说取个number。OK。取个number,但这个number呢,你也可以定到外边去啊,可以到外边去啊,这样子我们定到外边吧,啊定到外边去比较好一点啊,那就VI啊,因为因为是个整数嘛,说number好,默认是零嘛,好,然后呢,我这就不要再定义了,我就直接从这个管道里面取个东西,怎么取箭头,这样子OK了。好,那取出来过后呢,你你就应该去判断它是输出了对不对,是这样子的吧,好判断。判断这个是不是数数。是不是叔叔?
08:00
那么怎么判断一个数是不是数数呢?各位同学还记得怎么怎么玩这个东西吗?好,就是什么叫负数,就是除了自己和本身能够整数,其他都不能整数,那我可以这样干,For循环。I。从这个二开始,I小于等于什么呀?就是number这个值,诶应该是对,就是小小于小于number就行了。是不是小于number,就是这样去判断,然后呢,I加加I加加,我做一个什么判断呢?如果你这个哎,就是number这个数,它模上我上这个I只要有一个等于了零,说明它是数数还是不是数数,各位说明它是还是不是说明。说明该number,该number不是。不是素数。不是叔叔。
09:02
啊,不是叔叔,那那这样子的话,我我就可以这样做了啊同学们大家看我的思路这样子的。再举一个,我在前面先定一个flag。啊,对,我我先定一个flag啊。我们假定。Flag flag钉到上面去,也把flag钉到上面去,OK,这个没问题,Flag。Flag是个不字。不子大家看啊,这个呢,我是用来标识是不是数数的,好假定我们一进来取一个,我们就假定它是一个数数,好假定他是一个叔叔,我们假设啊,假设是叔叔。但实际上是不是我不知道。那如果他在这个for循环里面发现有一次进来了,就说明它不是输出,所以说我将这个flag直接置为一个for,那最后整个for循环做完了功能,它只要不是直接退出。
10:00
就说我发现它有,它有一种情况是除了它自身还有别的数也可以整除的话,说明它不是我就退出来,退出来功能在在这个负循环里面判断一下,如果这个flag是为假。那么说明此时此刻。啊啊这样子啊,说错了,应该纹身这样子,就说他在整个这个判断这个number的过程中,他一直没有进到这里面来,就他扫描完了过后,他发现一一次都没进来,说明它仍然仍然是一个帧,就是我们假设是对的,那如果是对的话呢,OK,这样很关键,放入将。将这个数就放入到哪里呢?放入到这个。放OK,放出圈,这个也非常简单,就一句话的事,因为管道本身它是现场安全的,所以说你就放一个就行了,往这边扔一个谁啊,Number。往这面扔一个number,好,当你扔完这个number以后,同学们他做完一个数过后,他是不是又去又去取啊,又去取又去取,哎,什么数他取不到呢。
11:08
什么是取不到,是不是就是从这个inter取不到,就是取不到东西的时候,他就退出来,那么应该是不是我们这样做更好更好一点,来一个这个判断啊,是不是这样子更好一点。还有一种可能性就是。哎,我我想想这边有点问题啊。我想一想。嗯,我们不停的取,取完了过后。啊。没没没问题吧,好像就这样子的啊,这样子就他有两种情况可能导致他退出。就是,呃。啊。哪个OK?这样子,如果他这个OK取不到了。就是说他他发现你已经关闭取不到了之后,是不是也应该退出啊。就两种情况有可能退出来啊,这个退出是指的退出这个for循环,这个退出是指的退出外层这个for循环,就是就管道取不出来了,这两个概念不一样啊,这个是指的管道里面取的东西了。
12:11
就这个管道里面取不到东西了,因为它有可能东西取完了啊,这个是取不到了,取不到。好,应该是这样的逻辑。好,这样子就行,如果我取到了,如果我取到了,那我就去判断是不是,如果发现它不是退出来,然后再把它加进去,好不停的这样做,不停这样做好最后,那么最后当他跳出整个这个负循环的时候,就意味着当前这一个携程工作完毕了,就他已经。他他他完成他已经取到东西了啊,那就说这个携程完成不了了,就说有一个写有我这样写一句话啊,说有一个这个携程已经完成工作了,当然我一共有四个。就说明有一个primary完成工作了,退出了啊,学不到东西了,就有一个。有一个这样的携程。
13:02
携程这个取不到取,因为取不到啊,就是说因为取不到数据了,取不到取不到,取不到数据退出了。也就是说这个时候它有一个驱动,但是这个时候推出同学们想一想,各位同学。我现在能不能够把这个管道关闭,这是关键。各位同学,这是关键,就说你退出来了,是你退出来,你退出来的原因是因为这个,你退出来原因是因为你取不到,但是并不意味着别人渠不到,这个很难讲,所以说这个时候呢,你不能马上关闭它啊,你要干什么呢?你要做第一段事情,你要把这个。你你就告诉这个管道说我已经完成了就行了,你不要管别的事,因为有可能别的学生还正在正在工作或者干一些什么事,所以说呢,我们这样不要关闭它。安全起见啊,这里这里我们还不能还不能关闭,关闭哪个呢,这个空档。
14:04
你还不能关闭这个管道,因为有可能别人在正在处理。有可能别人在处理,所以说你怎么办呢,你要做一件事情干什么呢,像。向这个退出的这个管道写入写入,注意听好写入一个这个标志,写入一个出就可以了,加E,你就告诉他我完成了,好,你完成就你就走你的对吧,你完成你就走你的,那么我就写个出。好,这个就是一个构斜成,那就是处理,那么这个我一共我要取几个呢?我一共要去,我一共要去取四个,好,现在我们开启四个four。I。I小于。小于四,我一共要取四个I加加够我取四个携程,哪四个携程就是它。让四个作用在四个不同的CPU上,然后呢,我要传进去的是第一个,我要从这个管道去,第二个结果扔到这个。
15:08
Prime channel最后退出的标识写到这完事。也就是说我我这个地方是在不停的起了四个啊看go put,这个是去他们已经开始同时工作了,好这个就做完了,那紧接着呢,还有一件事情,最后一件事情就说你现在已经把这个都协调好了,你这边在不停的写,这边在在读,然后呢,计算放到这边放,但是不要忘了。你如果不做这个处理。你不做这个地方的主塞,那所有的事情都是白干了,因为你不做处理的话,他瞬间这个主线程噌的一下就跑了,你怎么还没干完事儿呢,啥事没干,跑跑跑路了。所以说现在的一个问题呢,就说我们必须要来玩这个东西了。而且同学还知道我们这个组,我们这个地方还没有关闭,大家发现没有,我们这个结果还没有,还没关闭呢,它实际上还没有处于还处于这个打开的状态,如果你打开,你要退出,你只能依赖它的长度,这样也不划算,所以说我们还要做一件事情,说怎么样在这等待它把所有的事情做完,同时还要去解决把它关闭的问题。
16:16
因为你不关闭,你你你不知道你到现在还要遍历这个管道啊。你看编辑这个管道,所以说现在这个地方也成为一个关键点来,同学们,我们现在开始写代码。这里我们主线程。主线程啊,要进行这个进行处理。那么这怎么处理呢?首先同学们,我们要我们关键的问题是要从这个,从这个管道里面,要从这个管道里面取四个这个取四个这个结构出来,就证明大家都完成了,这是一个最重要的判断标准,说我只要能够从这个退出的管道里面取出四个T。就说明你这个任务真的是全部完成了。甚至说明你这个组这个P的管道里面数据也是全部正确的,因为你只有四个携程,你只有四个携程都往里面写了一个出才有四个,所以说现在呢,我们要做这样一个动作。
17:15
For循环。啊或循环,那这个我们干脆这样做啊,直接。直接这样写,直接这样做。哦,我们想想这个怎么处理啊。嗯,我想一想这个怎么处理好,来,咱们这么做吧。Four。I。等于0I小于四。我一共要取四个出来。艾佳佳。大家叫我要取四个,从哪里取呢?从我们这个这个地方取四个。这个结果对我来说没有重要性,所以我直接扔出去就可以了。我直接扔出去就可以了,就说这个对我来说没有用,因为这个我只希望从这个管道里面取出个东西出来,至于这个地方是什么值,其实无所谓,所以我直接把它扔走就完了,但是如果取不到四个呢,我就卡这,我就等待,等待你这个取不到四个,我就我就等待好,然后如果这四个都做做完的话,同学们,那就意味着意味着什么呢?就说我们这个结果也就可以关闭了。当我们从。
18:27
这个管道,从这个管道取出了。取出了四个。四个这个结果好,那这个时候呢,我们就可以就可以放心的放心的放心的关闭,关闭哪一个管道了呢?这个管道了。因为我们真正要的东西在这里面,所以说这个代码呢,就变成这样子了,就它不列取好取出式的,然后同学们我就把这个关闭了。Close close掉我们的这个管道。
19:00
但是这样子做呢,他跟主先生发生关系也特别不好,所以说我整个直接用一个go fun,用一个匿名函数把它跑起来。也就说这方我起的也是一个携程,让他去做,大家看我的意思啊。我用那个携程去做,让他不要主在这个地方好对,然后呢,就调一下,大家看看能不能搞懂,其实我这也做了一个很简单的做了一个携程。做了一个携程,我让他去相当于写了个携程,他帮我去不停在在这去看有没有对吧,有没有最后最后一点这个地方可以写了啊。便利。便利我们的,我们的哪一个呢。这个结果把数据把结果取出来,把把结果取出欧了,那就怎么写呢。好,然后呢,我取值啊,第一个我要从哪里面取,取这个里面取,取的时候大家都知道,第一个呢,我们把这个结果results取出来,然后呢,有个OK。
20:02
OK,等于好,从哪里取呢?就从这里面取。因为你你你最终是有一个携程帮你关的。所以你放心,他这么总有一个有一个时间点,就是这个OK,取不到东西了,所以说当他当他这样子的话呢,我们就break,否则我们就把结果拿出来,将结果输出。结果输出结果呢,我们就简单的打印一下。我们就说数数有数数。啊,数数等于好,把它输出来一个就行。好叔叔,诶这样我打一个这个啊。好各位朋友这个写完,然后呢,我们把这个这个res,就是你的那个那个输叔啊,最后我们这提示一句话,因为他一直卡这的,说最后提出一句话说主线程退出。主线程。主线就退出好代码写完了。
21:01
哪个地方写错了?七十五行。七十五行,我关的是管道呀。哦,写错了,对对,刚才有同学说了关这个管道还有没有写错了。呃,哪个地方第几行61行,61行put,哎,对put number,我是不是没有把这个传进去。OK,还有哪地方有问题?这个地方吗?啊,这个也写错了,对,这个是从这个管道里面取东西,这写错了啊,把这个当成管道了,这是一个,这是个方法。便利我们管道把这个题出来,还有哪地方有问题?大家看一下还有哪地方有问题。保存一下。好,这地方又又又是一个啊,资源管理器。诶,这地方怎么又又掉出来了。
22:04
点的是哪个地方。资源管理器是这个吧。好,我们看这边有有毛病啊,代码哪里有写错,看这应该有一个错误。哦,这个是重复定义,那这个就是不是就就可以不要了。这个标。好了,这个代码写完。那写完过后呢,这样子啊,因为这个这个数据就是我们这个八期这个数据呢,过大,我们先整一个小的,看看结果对不对。80吧,现大大先先验证一下嘛,最后我们应该至少这方应该有四个啊,说有会打出四句话。好,我们来跑一下。呃,CD点点CD到China,我们的零三对。CD到看一下啊,DRCD到。
23:01
这个China。啊,China go GR。GO03好点,Go。Run我们的主函数周。好同学们,我们可以看到啊,这个结果是正确的,你看有一个数数这个为什么一下就推出来了。为什么呢?因为你不能保证他的那个。这个顺序嘛。所以说刚开始的时候,比如说我其中一个,我马上就可以取得到数据啊。我其他的数据我存的时候存数据速度并不一定。啊啊,我明白你意思了,就是存就存的那个地方是吧,就存的速度可能还没有存,他就马上去读了,结果这个声造成这么一个情况。那这个也问题不大,那也是很正常的事情了。
24:01
其实这个地方处理要站在。加个什么?我看一下啊,做一个就说取,取的时候,我们把这个结果可以看出来,就说我们再看这个结果对不对,先看。好。这不,你们不能这么理解啊,同学们,其实这个地方的顺序不是刚才那个小夏说的那个原因是是什么原因呢?就是你看数数,我们都起诉完了。他有可能是因为是我就是打印你知道吧,就打印有可能你打印的这个时间跟那个处理时间不是不是一样的,因为你你可能那个做你还没那边打印,他还没打印它这个结果就已经出来了,明白我意思吧,其实不是这个原因,他还是应该是取到了,你看不然的话,你看怎么会出现这种恐怖的情况,我这啊,我这就直接推出了数据还出来了,那不可能。但是你虽然说你都打印出来,是因为你平时四个,本来是四个工作,你可能后面。
25:04
行行,那就是11嘛,那其实这个地方没没毛病,就说我们可以做一个很简单的处理,就是让他这个去取的时候稍微慢一下就行了,取稍微慢一下就行了,这个这个这个我们我们不先把这个效果打出来啊,看点sleep。Sleep,好啊,往上面去是吧,一样的写上面吧,Sleep这个时候我们不需要休眠疫苗,休眠疫苗太慢了啊,我们有一个时间叫做呃,叫叫什么来着。我们我们看一下有毫秒吧,我记得我们有毫秒。那个毫秒是怎么写的,他写的mi是什么什么是吧。他这没有提示啊,同学们给我说一下啊,Mi什么L。我在这查一下,打开我们这个手册啊,打开我们的手册,我们的手册上哪个地方去查,同时也是一个复习打开这个资料API。
26:07
在哪里呢?在time对,在time这个包包,诶找一下这个time包,Time包在哪里呢?在这个包包诶。呃,Time t打头的。T打头应该是这个包好,这个包里边呢有常量,但是这个应该是这个大家看到这面这面呢,这是呃秒,这个是应该是相当于是毫秒对不对,毫秒上面那个是微秒,咱们毫秒就可了。你不能去除啊,同学们好,我们在这起个毫秒,毫秒的话呢,呃,我们来十毫秒吧,这样子大家应该看出效果了啊,看出效果了,因为它取的时候会慢,这个时候我们需要有一个time包,哎,需要一个time包,这样是看效效果。好,这样看一下效果。好,这样就就看起来很正常啊,啊看,因为这个数太少了,数太少,如果数数多也不会出现这个情况啊,数的也不会情况你看。
27:05
数数123,这个结果应该是正确的啊,最后我这这个把这些东西都处理完了过后这个地方对不对,把这个结果也出来了,而且大家注意啊,有一点特别重要的情况,你们应该感觉到很奇怪。这个我打印出这个数数,这个结果是在哪打的。我是在这个地方打的,发现没有。大家有没有感觉到很奇怪,就是你在这儿?你在这打的时候,其实这段代码是在写在屁股后边。但是实际上我们在统计的时候是在这个地方,你看这个地方退出其实它是在前面,那么为什么打印的是在,打印的是在是在前面,那个输出在后面,谁能解释这个问题呢?我我代码的顺序不是按理说这个是在后面吗。
28:01
我这个时代我在后面,但是实际上你这个推出的代码是闲置型,为什么是这样子的呢?因为它是同步的,所以大家不能想象说他这个程序是按顺序执行的,其他一旦写写起来过后,大家都在工作,他不是我在等你。啊,他不是我在等你的,所以你看这个结果是这样子的,看到没有,你看很有意思,看,也就是说你在统计的时,统计的时候其实他已经他已经开始把这个结果都有可能已经拿到了,就说只是打印的这个问题,就他他一边在他是这样子的,他统计一个结果就扔进去,那边就在工作,也就是说他实际上是这样子的,就是说我一边取,我一边放,同时这个呢也在取。啊,这个,但这个取的时候,它是要取决于这个东西退出才取啊。所以这样这样大家考虑一下,那么这样子就可以了,这个数据量你可以调调大,比如说调一个8000。开个8000好,同学们看这个结果,8000应该也是正确的。
29:01
你看。叔叔。啊,全是叔叔。啊,这这这是不是叔叔啊。那这个可能就不够,给他2000可能不够对吧,输入还挺多的。够吗?好退出好退出好,同学们,那这个呢,大家体会一下它的这个这个用法,好,我把代码给同学们先放到这里来。好,代码放到这里来。好的,这是我们的代码,代码OK,那关于我们这个案例,这个案例呢,我们先介绍介绍到这里,大家休息一会吧。
我来说两句