00:00
我们前面讲了那么多关于管道的知识点,其实就是为了解决问题,对吧,我们讲了它的定义啊,它的特点呢,它的关闭啊,它的定义啊,其实都是为了一样一个问题在服务,就是最先前提出的一个问题。现在我们已经有有一点功底了,就是我们在那个少林寺学了一个对吧,基本功挑挑了一年水,然后呢,砍了两年柴,现在我们可以干什么呢?打人去了,好,我们看看怎么修息修理他啊,来看一个案例,看一个案例。好,这个呢,先先跳过去,我们直接看这个应用案例好不好看案例了啊。因为现在我们已经有一点有一点基础的同学了,我们不再是小白了啊,看力。请完成一个GR和China协同工作的案例。也就是现在我们要把这个携程和China合并,合在一起,让他们一起去做这件事情。具体要求是什么呢?第一个要求开启一个right data,携程向管道interr写入50个数据。
01:05
这个对我来,这个对我来说难吗?不难。你开个携程往里面写数据是谁不会呀,第二个开启一个read,携程从管道in的,像那种读取right data写入的数据什么意思,就说一个向管道里面写,一个管道里面读,注意管道它是引用类型,也就是说待会读和写的呢,是同一根管道啊,同一同一个管道,第三个。主线程需要等待写write data和read data,携程都完成工作才会退出,这里面就是一个关键点。我们要解决前面提出的一个痛点,什么痛点呢?我等多久?显然,这地方绝对不能再用四音符。而且你也不能一点都不处理,因为你一点都不处理,主线程噌的一下就跑了你50个数据,你还有还没写呢,直接就了,所以这个地方呢,我们就会引出一个什么呢管道。
02:09
各位各位同学啊,来,现在呢,我们来直接写代码了,思路开始来玩啊,我画一下我的示意图,我画一下我的示意图,我先给同学们说一下我要解决他的问题的思路。所以讲啊,这个思路很很重要,思路分析完了过同学们,那我可以这样说啊,你只要把这个思路分析完了,后面只要涉及到管道和相对的一个通讯呢,大家心里面就不会那么紧张了,来,我说一下我的这个解决方案,大家先把这个题读懂了啊。题应该读懂了啊,我现在把我的一个想法,我的一个设计理念,用图形的方式展现出来,我要这么玩。我这么玩好的,那现在呢,因为因为我这个地方呢,我不想破坏我画的这个图,因为这个图画起来很不容易,所以说我就复制一份扔到下面来。
03:05
好,注意听啊,我扔到下面来了。对,我扔到下面过后呢,我要开始玩这个东西了。怎么做,待会儿我会起两个斜程,我我先整两个,不要整多了,因为待会我一个个携程一一起起多了,你也受不了第一个携程,我们叫做right。Get。啊,第一个写成叫right,注意听。Right,第二个携程,我们叫read data。一读一写吗?好,另外这两个鞋子,这两个没有了,因为我我们现在不起那么多,就起这两个协同工作的。这个是我们的主线程,同学们你要理解,你要怎么理解呢?你要这样理解啊,你要理解你整个线程是这样做的,就是你的主线程是一个很长的线,它在一个执行环境的时候,也就是说它在。
04:00
他在一个上下文环境时,他在一个上下文环境时,就相当于说这有个P,这有个上下文环境,然后呢,由这里面呢,跑出去了。跑出去了。就说呃一演就是说他自己在这里面去创建了两个携程啊,创建了一个线程。好,我把这个线把它弄的这个稍微的好看一点。这里。啊,颜色肯定是要调一调的,这个对吧,这个颜色我是要调一调的,来整一个比较好看的颜色,美观嘛,好,那么主线层你不不要不要着急啊,就主线程这块还是往下面走的,你不能说诶到时间我们去玩的时候,这个这个主线程不跑了,主线程肯定是往下面不停移动的,他说主线程往下走的。那这个地方大家都都知道,这个主线程你不去处理的话,他一退出,那是问题就变得严重了,就是说如果你不做处理,你主线程一点都不不做处理,他直接一推出,你两个鞋子还没干事就直接跑跑路了,说这不行,那我怎么办呢?我这里会创建,至少要创建两个管道。
05:13
我要创建两个管道啊,呃,我看看这应该怎么做,我看他的思路啊,三个管道,两个管道比较好看一下。一个right,我现在写,写完了过后我读好,那我两个就够了,我不需要三个,不需要三个管道,我我我的机子是这样的,同学们注意听,有一个管道呢,这个写读的管道和写的管道都往这一个地方写,这个管道我们该取个名字叫in。注意听啊,In。那么这个写的管道是往里面写,而读的管道呢,是读。说他呢?应该换一个方向。就是说这个携程这个管道,斜程一这个管道呢,它是拼命的往里面写,而我这个RA的管道呢,是读,它们是同时工作的,没有谁先随后啊,可能是这边一边在写,而另外一个同时在读,明白我的意思吧,不是说你写完了我才读,不是这样子的啊。
06:11
不这样子的好,那有一个问题,我怎么才知道,我怎么样才知道你们把这个事干完了呢?说你你读完了,你写完我怎么知道呢。我怎么知道呢?好,同学们,我问大家一个问题。读这个数据就读他是不是,他是他自己很是很清楚的,他自己知道一定要读,一共要读多少数据出来是吧,他说我要读50个。那我只要保证我能读50个,就代表级数读技数,那么这个时候呢,我们有一个办法这样解决这样一个问题,就是。我呢,在这地方再设计一个新的管道。哎,对,刚才呃,有同学已经有思路,就说我在新设计一个新的管道。
07:00
这个管道叫什么名字无所谓,比如说我们叫这个名字啊,比如说韩老师取个这样一个名字叫退出管道。我们取一个新的管道名字,这个管道的名字呢,我们姑且叫做退出。这个管道里面呢,是放布尔类型的,或者放个什么数都行,就T也无所谓,也无所谓,然后呢,我只需要这个read data,在它读取完50个数据以后,注意啊,这有个前提,就是read data。注意听这句话啊,就是它读取。读完。读完50个数据后。我建议我,我要做一件事情,让它向这个管道里面写入一个值。写入一个是写入一个值,并关闭这个管道啊,并关闭这个管道就是它写入一个值并关闭,比如说他在里面写一个,呃,比如说就布尔值吧啊。
08:02
好,它往里面写入一个管,写入一个词,比如说写入一个出。然后呢,并关闭。他只要写完了,他就关闭它。他写完50个数据后,向。像谁呢?他像这个数据。它向这个管道,就是同学们看到这个退出管道。写入。写入一个一个布尔一个处吧,并关闭并关闭。并关闭该管道。该管道,那有些同说你这个有什么意义呢?我的意义在这里,同学们这个管道事先就有,然后呢,我的代码,它不是当他把这个T这个执行完了过后,它继续往下面执行,它是不是还有代码吗?然后呢,我在这里有一个负循环,注意听我在这里负循环去读取。这个管道。
09:01
因为这个管道呢,都是在主在这个主线程创建起来的,就说我在这一一直读。他会有一个什么情况呢?只要你不只要你只要只要我这儿。没有退出来。只要我这没退出来,好,那我就一直读取,直到你关闭过后,我把这个读完了,我才退出来。那这个词的话就代表你这。把这个读完了过后,我再怎么办呢?我再退出,因为我是知道你相当于说这这个好像是一个标志一样,说诶我读完了,告诉你我读完了好这边呢,他一声而读,他只要读到一个处就代表诶我也该退出来了。啊,就这么一个意思啊,就这么意思,因为你不往里面写,你不往里面写,我读不到,读不到我就阻塞在这个位置。我就主塞在这个位置,好是这么一个意思,好同学们现在呢,这个思路已经有了,我们用代码来实现它啊,我们用代码实现它来快速走一下。那么这是我们的一个应用案例,云案例。
10:01
好,这个代码送哪去了,刚才。诶。哎,刚才怎么一下全部没了呢。查看。好看一下没了,好,然后我们把这个练习做一下啊,把它应用。呃。Apply就是我们的管道的应用。好,我们来写一个小案例。写案例啊,来写一段文件,叫main.go根据老师的思路,我们来完成一把package主函数。好,然后呢,我引包包。Form好写主函数。首先,首先我们在主函数先创建两个管道,也就是说刚才我们这两个管道必须是在主线程里面创建的,因为它这个携程呢,也是读的这两个管道,我们主线程呢,读的也是一个,呃,推出一个管道,这个就没问题,因为它是共享的,我们刚才讲过管道它是引用类型,所以说你在不同站里面其实用的是同一个管道,这个很重要,那现在呢,我先创建两个管道。
11:17
创建两个管道。好,这个非常简单,VR就直接写啊,In the,然后呢,我直接make。我make一根管道,这个管道是turn in,里面放十五十个数据,写完了再来一个推出管道。退出管道里面呢,我们放这个布尔类型的,当然也可以是别的类型,无所谓布尔,然后呢,我就放一个。好,这页写完了,第一句话写完,那写完过后呢,大家看到老师呢,对我呢,要去,我要干什么事啊,我要去写两个,写两个携程那一个叫write data data,一个叫read data,好,我现在呢,要想办法去写这两个函数。
12:01
一个是right。Right data。Right,呆头。好,那这个也非常简单,放。Right data,然后呢,你要把两个你你要把这个管道给我传进来写的时候呢,至少至少对他来说啊,对他来说,他需要知道一个inter channel,我才能往里面写嘛,所以说呢,我现在写一个inter。它的类型应该是change in里面这个数据,这个无所谓了,因为这个管道有多大,它事先就已经写好了,我开始往里面放东西。好。呃,也可以,就是你直接在这地方去go wrong go一个逆名函数也可以,诶就是它那个这样写也可以,但是我我现在还是写稍微简单一点啊,就go直接用个go也可以,就是go wrong这样子把代码把你该干的事写在里面也是可以的,好吧,也可以,那但我现在先缓一下吧,因为并且函数相对清清晰一点嘛,啊清晰一点,那0I小于,我们一共放50个数据进去,I加加。
13:12
OK,那这样子啊,为了好看呢,我就直接写一和古诗吧,这样大家一看就就看得很欣喜,往里面扔数据了啊,放入数据。放出,那放入数据的话呢,其实就是往这个管道里面扔嘛,那这个很简单。那就in I写完了。他把这个数据,他把这个数据写完了以后啊,他把这个数据写完以后,他的任务其实就完成了啊,但是呢,你不要忘了,还有一个读瑞的这个data,注意他们是同时工作的啊,他们是同时工作的,那他呢,Read的一个data,他要接收这个管道必须要,为什么要这个呢?因为你没有这个管道,我不知道从哪读啊,我还得有个退出的一个管道。因为我我我我我写完了,我相对说像这个管道发个消息说对不起,我告诉你啊,我做完了,那么它的类型呢,是一个波尔类型。
14:04
好,这个地方我就开始读对吧,我我就取嘛,相当于说我便利我去便利这个in inter券,把里面所有东西都取出来,取完取完对吧,好取完的话,其实我可以这样做,同学们,我没有必要for循环,我直接让它关闭这个管道,是不是大家知道我什么意思吧,就说我这样close这个就说当我把50个选完,我就关闭这个潜龙。就说我写完了,我关闭了,我不并不影响你读吗?这个能理解我的意思吧,就是我写了50个,我的任务就完成,我关闭,关闭的好处是我在这地方可以用负循环去读啊。是不是我可以用for循环不停的读嘛,读完过后他发现有错误就出来了,所以说我可以这样写,那就我就写这样for循环啊,我就不停的读,读的时候我这样读。怎么读呢,我这样读啊,我用这种这种换一种方式啊,和前面本质是一样的,我就直接读这个东西,一个是V。
15:02
一个是他的那个OK。大家还记得这种写法,会也会返回两个字。啊,大家应该还还能看懂这个代码吧,这个代码是从这个管道里面取V呢,就是取出这个值,OK,代表到底取没取成功,看一下刚才这个代码。看这里。就是从一个管,从一根管道里面读的话,它也会返回两个值,一个呢就是具体的值,一个是到底有没有成功啊,有没有成功,一旦一旦关闭,读到关闭的时候它就不成功了,所以说我这做一个判断,如果如果OK,它取不出来了,我就。Break,那么否则的话呢,我就我就这样说,我我读到一个数据了。我就写read data read data读到一个数据了。读到读到数据,这个数据是多少呢?好,我们把它输出来。把输出来。好的,那这个数据显然就是V。
16:03
好,那这样他不停的读,不停的读,等到它1CLOSE。不是,是这样子啊,同学们,不是他不是他1CLOSE我们就退出啊,我可没这么说啊,他1CLOSE它并不会退,退出它是不停的取,取到最后。他才会脱出退出,这个能理解吧,刚才我在讲那个基本原理的时候,大家想一想,就说你这关闭并不影响我读,我什么时候退出呢?我把你这50个数据全部读完了,我才break,能理解吧。所以说这个close显得很重要,如果你不close啊,同学们这个地方就会发生一个四数。这地方就会发生一个死锁,所以一定要close掉啊close掉好,然后这个地方你做完这个事情,当你整个这个读完了,各位同学是不是相当于我把这个事情就做完了,那你做完了你得告诉谁呢?你得往这边发一个消息,说我做完了啊,你然后这个这边不是还有一个行,我这傻傻的等吗?我我只是还没写字而已,他这一直要在读这个东西的,他也等待你的关闭明白吧,所以这个代码就变成这样子了啊同学们,他做完这个工作以后。
17:11
这里read data data,这个读完读取,读取完数据后,相当于把任务完成了吗?就是及任务完成及任务任务及任务完成。及任务完成,这时他要做两件事情,第一件事情他向这个这里面写一个数据进去。这个没问题,写写一个数据就写一个数据嘛,这个很简单,我写一个处。啊,写进去马上关闭它。就说我现在我把这个写一个数据我就关了,那关闭的意思其实就是为了让这个家伙能够知道我要退出了,哎,那你写一数据怎么办呢?好办,那我在这个地方我怎么就够了,两个携程,一个是。
18:00
Right data顺序无所谓。第二个,我够了一个read data。这个也不是这个OK,好,同学们现在这两个都在工作,如果现在我们不做处理啊,同学们你会发现。读的这个任务瞬间秒散,直接就出去了。明白我意思吧,所以说大家看此时此刻,假设我一运行,我请一个同学想一想啊,同学们,如果我在这个主函数没有做任何工作。那是大括号。啊啊这样子的。好。好,各位。保存一下。好,这地方,这地方是right。啊,参数还没传是吧,一个是in的项。一个是in the,还有一个。Exit圈,我问同学们一个问题。
19:03
我请一个同学思考啊,假设我下面没有刚才写,我这没写任何代码,请问。这段代码你们预计它会出现一个什么情况?是不是基基本上就是秒散一下就推出去了,因为你没有,你相当于说什么意思,就说他现在确实写了两个事情,准备做这个事,一个往里面写惯,但是因为你这没去管它,直接就这个主线程就退出去了,主先生一退出你两个携程。也没命了,就相当于说什么呢,说有一个这有有一个有一个主体都消失了,那你这个附在他身上的也就没有了,就好像鬼附身,那鬼还得附在人身上吗?人都没了,你他也得重新找家呀,好,你可以试一下,你你可以试一下啊,同学们看走。我们给它简单的看一下案例,CD,点点DRCD到China apply,大家看go run main.go好,你看直接是秒闪哦,就啥都没看到。
20:06
这上市为什么啥都没看到,直接退出来了。他直接退出来,你没机会啊,说老师那我呃,你现在我们也不能sleep啊,说老师sleep sleep也可以搞定,但是肯定不是,我想你看sleep就确实还可以用sleep呢,你看看啊,time.second。SESESE,比如说我来乘一个十秒,你们可以看到数据,它也能完成十秒功能退出,这也可以,但是这个十秒肯定显然就不是我们希望的。因为我们现在就是要解决问题。对吧,我们现在已经搭好了,我们看看这个传统方法还是可以用,你看好你看这个数据。你看是不是。这个数学已经处理完了,哎,写已经已经读完了。哎,老师写的数据在哪呢。写的数据我没打没打这个信息啊,我给他打打印出来啊,写的时候我可以我可以把它打印一下。
21:08
我也可以把这个写的数据打印出来,就是write data。Write data这个地方它一定是一个交叉的啊,Write data,呃,我写写什么数据呢,写了个I,大家看这个时候我我在一执行,你会看到写和读它应该是交叉的。你看有写有毒,你看有写有毒啊。就会写的全在一起呢。知道为什么吗?因为是不是太快了,他先启动,他蹭的一下就跑了,如果你看这个效果,你还得这么干。是让他写的时候修一下眠是吧。你修一下修一下眠,让他修修秒钟这个数据就应该看出来了,点second,这样它就应该是个交互的啊。Second好让他修一年,一秒再写,读的时候呢,咱们也是一样,这个时候一定是个交叉的,一边写一边读,一边写一边读看效果。
22:04
绝对不是那样子啊,绝对是一边写一边读看。哎,果然是不是大家看效果没有,是一边写一边读,一边读一边写啊,一边写一边读一边读,看有写有读,因为它是交叉的,好,现在问题已经解决了,最后一个问题说老师写十秒显然不行。我们搞了这么久,就是要解决这个问题,好一个问题解决了,For循环走代码,我在这儿不停的去读,这个退出的管道我在不停的读,只要你不关闭,我就卡,那就阻塞在那个地方,阻塞在地方怎么阻呢?V我就这样写,我就去,呃,从这个地方取,那就是V,还有一个OK啊这样子的OK。啊。嗯,也可以也可以。那你如果要那样的话,你用要用foreign啊,要用那样才行,这个不然的话它推不出来啊。
23:06
Break。啊。对也可以也可以也可以,我们我们先按这个写写吧,好吧,先按这个写,写完了再说吧,呃,先把这个读出来,然后有个OK。然后呢,写就是从这去读呢,从这个退出里面读它。其实就这样子一一串啊读,如果我们这一方。读不到东西了,因为它关闭了嘛,OK,好,读不到东西我们就break。就退出来,就说如如果我如果我读不到东西,我就退出来了,看效果啊,同学们看。那这位搞错了吗?V。哦,这个我没有用,是不是没有用,那就不要他了。没有你就不要他了,忽略好同学们看现在我们实际上啊,这个就很就很完整,你会你会看到他完成这个事情,就直接按照实际情况退出,而不是在傻傻的等看代码。
24:05
还在吗,走。好,写读写读。好,这个时间太太长了啊,我把这个实力关掉吧。把这个sleep关掉,因为sleep。11普这个等的时间太长啊,把它关掉关掉,我们来看一下这个时候啊数据,首先我要保证数据全都有了。这这个为什么呀啊,他包因为我不用了是吧,你们这个时候看到速度很快就完成,同时同时呢,我们这个地方也没啥的啊,看一下我。退出看到没有,完全是。一边读,它也是一边读一边写,看到没有读读写读写,然后呢,最后读完了过后,读完了过后退出来没有等,而且呢,数据也是正确的,好,这是我们讲的一个,呃,比较重要的一个东西啊,同学们呢,呃,当然还有很多细节,明天我们还要分析,就说你们把这个原理图搞清楚,今天的任务两点啊,第一个在我这个基础上解决前面的那一个问题,前面的问题我们不是有一个什么问题,就是那个那个算那个什么玩意儿,算那个阶层,后面我们不知道怎么推出吗?你想办法把它搞定,这是第一个,第二个题呢,就是今天晚上的一个作业。
25:28
好,晚上的作业我先给大家说一下。OK啊,同学们。好,今天晚上的作业呢,我也布置一个,这个作业呢,有一点难度,有一点难度你们可以先呃,尝试着看看能不能做啊第一个。启动一个携程,将一到将一到2000的数据放到一个呃这个channel里面去,比如number启动八个携程。从number取出数据,就说有一个携程是往里面写,但从这个从这个number里面取的时候,是有三个写生取,取的时候呢。
26:10
比如说取出来是一个N,并计算这个一加N的值,并且把它存存放到一个叫瑞士的圈,到这个这个里面去,也就是说最后这个结果呢,全部都是在一个在一个管道里面。最后八个携程协同完成工后工作后再便利这个结果,这个这个管道把结果呢给我打印出来。也就是说这地方大家想想怎么做,就说有一个携程是往里面写数据。写写,当然写数据是很快的,写完了过后呢,有八个携程不停的从里面抓东西,抓完东西过后把这个结果放在另外一个管道里面去,最后工作完毕过后,从这里面把这个字给我打印出来。这个有有点难度啊,这是第一个题,第二个题呢,呃就更麻烦了,第二个题呢,是GR加China配合排序写完并写入文件来完成,开一个携程。
27:07
向这个文件里面写1000个数据。然后呢,当这个写数据的携程完毕以后,再调用一个salt,这个携程从这个文件里面读取这个数据,最后写入新的一个文件。也就是说考察点在哪里呢?就说你怎么知道第一个学生把这个数据写完了,你才开始工作。这个看看大家能不能把它协同起来啊,还是有点难度的,然后呢,公在扩展一下,把一个全部给我扩展成十个,就是有十个先生在写每一个1000个数据写到10个文件里面去,还有还有呢,就是让十个salt携程从十个文件里面读取1000个数据,然后派送完去,最后写到十个结果文件。好好,这是晚上,晚上你们先做这一个吧,这个作业你们先不做,这个题有点难,你们先把第一个能做好就不错了,就是把今天的这个题,还有呢,就是我们上午的这个题。
28:10
就这个题,还有就是我们。呃,这个中午有一个题呢,大家说了,然后没有没有提到的啊,这个题还有一个就是,呃,就是我们把使用。啊,使用这个斜程加管道。加管道解决什么呢?解决就是我们上午提出的问题。上提出的问题。OK,没问题,我把这些全部给大家啊,包括这些东西,包括上午的作业那些全部告诉大家,好,今天呢,我们就先给大家介绍到这里。
我来说两句