00:00
好,各位同学,那开始咱们这个新的内容,那昨天呢,我们写了一个代码,这个代码写完了过后呢,我们还没有把它放在笔记里面去,行吧,整理到笔记里面哈,各位同学复制一下,然后呢,直接放在我们这个代码里边去。这是有一个什么代码呢?就是我们的一个应用,对,有个应用叫应用实例一。给他来一个板书,这是我们的标题三。标题三,然后呢,这个应用的要求,对这个应用的要求呢,是这样子的。是这样子的,好的。这是我们应用的要求。那要求完了过后呢,我我我前面讲的先是一个思路分析。这个思路分析,我记得我们是画了一个图的,我把这个图呢,也给各位朋友放到我们的笔记里面去对。这个图呢,大家要去理解哈,多去理解一下,当我们的以后这个管道多的情况下,大家一定要记住多画一个图。
01:07
呃,现在我们才三个管道啊,才三个管道对吧,我们现在用这个应该是只用了好像就才用了两个管道,那三个管道四个管道多的情况下,你就要去画图了,好然后呢,具体的代码实现呢,各位同学哎,代码的实现。代码实现呢,就是我们这一个文件夹里边的东西,我将其复制复制一下。然后拷贝到咱们的笔记里边去,各位朋友来吧,给它插入一个小表格,诶,插入一个小表格,把它放到这就OK了,好,这是我们上一节课的一个笔记的补充,那我们看下面的课程,第二个我们看这段代码。那么应用实例二叫阻塞,那阻塞是一个什么样的情况呢?大家可以看到在这里啊。如果说我们注销前面写的这个项目里面的叫read data。
02:06
如果我们把这个注销程序会怎么样呢?这个这个只是让大家先思考一下,你们觉得会怎么样,各位同学,如果我们现在的情况,一旦老师把前面的这一段代码里边的这个read data进行一个注销,会怎样呢?同学们,它应该会出现这么一个情况,大家想一想,也就是说你一旦把它注销,其实你这个right。你这个right,大家可以看到,你这个只有只有一个往里面写的过程,但是没有人取。对吧,没有人取会出现一个什么情况呢?各位同学,打开我们的源代码,那么就意味着你在这个地方傻傻的往里面扔,但是没有人取,那你想一想。当我们存入的这一个数据超过了你的这一个啊,我们这刚好是十是吧。
03:08
还好,我把这个调小一点吧。我把这个调小一点。我就调成十啊,调成十,我把这个调成十,那你想如果说你不停的往里面往里面写,但是呢,你你只有十个,等到你又不取,那么最终这个管道会因为你的数据多了,就是往里面这个放的数据多了,你又没有取而阻塞,阻塞在哪个位置,我想找一个同学说一下。你们感觉会阻塞在哪里呢?是不是应该是这地方有个错误。对。所以说这就是为什么如果我给的这个容量就是50,那可能是刚好就放进去,它没问题,但是我们给的管道跟你放进的数据量不匹配,就是你的管道的容量小于你要放进的数据,但是你又不取的话呢,它就会阻塞,阻塞它就会爆一个。
04:04
Dead lock啊,也就是说我这样分析的结果,大家看到我这写的这样子,如果指向管道里面写数据而没有读取,就会出现阻塞,而发生一个对knock,原因是in inter圈的容量只有十,而代码会写50个,这样会阻塞在这里。那有些同学老师你你分析这个有什么用呢?我分析这个就是告诉大家这个管道,如果你你这个管道很小。你的数据量很大,只要你一边写,我一边在读,无所谓,当然有些同学说老师如果他写的快,写的快读的慢呢,没问题,这个它本身是会有一种机制的,比如说你写的很快,但是他读的慢,他他写的时候他就会在那阻塞,它只要有阻塞,它有它会编译器会发现,虽然我会阻塞,但是呢有一个人在不停的取。这个也不会发生实锁,实锁是什么问题,就是编译器底层会它会进行一个分析,他发现。
05:08
我这个地方在不停的写,但是没有任何一个学生去读,完蛋。但是如果他发现有一个携程在慢慢的读,无所谓,比如说你这边写的时候是。不修连蹭的一下,就这个波循环就是那样写,我读的时候,我每隔两秒读一下,他也不会是说明白意思吧,哎,这个地方大家要清楚,就说就说你只要感觉这个管道它在不停的流动,比如说我这个写成噼里啪啦,我就很快我就写了200个。但是我这边读呢,我从这边读,我读的很慢,这个也不会失手。啊,因为编译器它会分析,我们待会呢可以试一下啊,各位同学来我们先看一看目前这个情况是否已然发生的实数。啊,就是要把这个原理呢给大家聊两句。
06:00
好,现在呢,我已然把这个read data进行了一个read data进行了一个注销,朋友们来看,待会呢,应该会在这个位置发生实数。我再讲一些原理啊,同学们就是把这些搞清楚,那么我我们分析呢,应该在12行,它往里面扔的时候,这个地方有问题,好跟我们的分析是不是一样呢?OK,来,我们来运行一小碗,然后我们先回到前面的一个位置啊,我先克令一下各位同学CD到我们的chapter。啊,CD到go什么呀,扣的对不对,然后呢,CD到chapter什么呀,幺幺几啊16DR一下进入到我们的这个channel apply对不对,然后呢,Di项这方有个main go run main.go好。各位同学请看。各位同学请看,果然发生了一个非常经典的错误,叫did knock。原因是在D。
07:07
47号。啊,第47行,那第47行是哪一行呢,各位朋友。啊,第47行,它是这个位置。好,这个位置也会发生一个失错,这个位置也会发生失错,我们再看看有没有其他提示。大家看到这个地方应该也会有啊,它根本的原因是说它是发生了两个两个情况,一个是就是你这边有一个receiver的地方死锁,因为你没有关闭嘛,你不关闭它也会发生一个死锁。因为你没有机会关闭他,发现永远没有机会。他永远没有机会,所以说47行会发生失说,同时呢,在这个read data里面呢,第12行也会发生一个失说。啊,因为编译器会分析哦,他说完蛋没有机会,永远出不去,那么在12行,就是刚才我们所说的这一行呢,也会发生失错,那有些同学老师,那如果我的这个地方打开,我的这个read打开,但是我读的比较慢,你这写你这写我蹭的一下就写进去,我不休眠,但是我读的时候我休眠一下,我慢慢的读,会不会失所呢。
08:21
大家可以考虑,因为那个地方其实他他写的很快,我们来分析一下这个地方,如果时间哈,这个写的时候噼里啪啦就写进去了,但是读呢,呃,读的时候会一点一点读的,看这地方会会会否就是他们之间会不会有一种什么机制呢?就做叫做异步,异步的一个处理机制,我们看看。这个勾构斜程它有没有解决这个问题,来吧,我们跑一下啊,大家看写的时候是。噌的一下写进去了。而读的时候是每隔一秒我读一次,显然这个时间他们是不同步的,来跑一个代码,各位同学来跑一个代,走起来。
09:09
走起来你们可以看到,你们可以看到完全没有问题。完全没有,其实你写看啊,这个时候大家因为他前面先写了十个,我才开始读的,那这个时候呢,他就迫于这这种这个不同步机制,你写你只能变慢了,因为我只能读一个你才能写进去,能理解我意思吧。就是你本身写的很快,但是你没有机会写,为什么,因为我没有读。我没有读,你看他仍然不会报错,就这个呢,它就是我们,我们可以理解成就说你读和写,即使这个频率不一样也没问题,但是你必须要去读。你看最后肯定就是全部是读了,你看后面还留了十个,后面还留了十个,等到你全部写进去了,里面还有十个读读读好最后读完了过后我关闭退出正确。
10:02
这点是很多咱们学够的时候,呃够写生的时候,很多同学容易蒙圈的啊,大家注意好,我取的时候是不是一定要怎么怎么样好,同学们,你们理解这个机制了,过后呢,大家再回头想一想小夏一的年代吗?小夏写的代码是他蹭的一下,先把那个地方哦哦是另外一个问题啊,就是就是他说也可以调,就说就说就是那个,其实你你的共用的那个数据是那个那个那个通道是可以不用开那么大的,对吧?哎,但你的程序里面也是样处理的,对不对啊。呃,所以说这个机制要明白了,大家就。再下再往下面写呢,就比较轻松了,好同学们,这里我讲了一个什么呀,阻塞的这么一个问题,这个叫阻塞还是阻塞啊,主塞啊,这个南方人发音都是。不准确的,你们知道有个中国有个省叫福建省是吧,那个所叫一个福建福建啊,福建那湖南湖建省份啊,特别搞笑,好我把这个呢,给同学们先放到这里啊,各位同学我把这里先放到这里,大家呢要有一个基本的认识,好这是讲了一个应用实力,讲了一个阻塞的问题,主塞的问题啊,阻塞的问题。
11:17
啊,阻塞的问题啊,主塞的问题,好,我先把它放在这个笔记里面去记住一下,OK,那具体来说呢,具体来说就是刚才老师这里面做了一个分析,注意啊,只要你有读就没问题,但是你一个都不读,而没有读取就会读就会就会阻塞啊阻塞,那么如果你要读的话,慢一点也无所谓,同学们好,我把这个先给同学们板书到笔记里面啊。哎,反射到这里面就说没有毒就会阻塞。好,我这呢,再多说一句话,同学们,我在这写一句话,注意。注意。就是就是读读的这个就是read,就是如果。
12:00
如果编译器,如果这个编译器底层编译编译器啊,底层就运行的时候啊,这个编译器呢,它它也会复制一个运行,它运行的时候发现。发现一个管道,一个管道只有写而没有堵,没有堵则,则该管道,该管道会怎么样阻塞?那有些同学老师如果主主色啊,就有些同学可能问这样一个问题,说老师假设我这地方就开了50个,我也写50个,但是有一个地方没有毒怎么办呢。他会不会被阻塞在里面写都写完了还阻塞个屁呀,对不对,那肯定这写完他不往里面写,那还阻塞啥,只是你没有读嘛,没有读的话,最后他就他已经不会,至少阻塞不会发生,这里可能是其他原因。其他的问题了,那么还有一点我要强调是,如果读啊读的这个频率,就是写写管道和堵管道管道的频率不一致,这个无所谓。
13:10
频率啊,频率不一致,这个这个不不一致啊,不一致这个无所谓,无所谓,那么这个时候呢,我们的这个这个主塞就有就是有效阻塞,它会阻在地方等你,诶干一个我带进去这个阻塞它是有意义的阻塞,因为他觉得我等一段时间,等一秒或者等两秒,我就可以让他这个管道动起来,如果他发现我在这等是没有希望的,他就会爆,等一等到明白这意思吧。做老师他怎么知道的呢?各位同学,编写编译器的人不是吃饱了没事干的,人家是要做底层分析的啊。说他有些同学在想一个问题,说老师他运行的时候,他怎么知道。他怎么就知道?有一个人在读。而没有读呢,这个就是它底层会有一种机制,他会分析。
14:02
他会分析,而且你会发现它只要你没有没有没有写,他不是要等几秒,他马上就会分析出来,那说明它在运行的时候,编辑的底层还是在不停的在维护这个上下文,是不是这个道理啊,所以这点呢,请大家要注意一下,就好像咱们去上厕所是吧,你那个进去过后,呃,你知道你上厕所肯定要出来,只是时间长了的问题,如果你知道这个人上厕所你在那等,他说他永远不出来,你肯定不在这等。因为你你可能就跑了对不对,好,所以说把这个地方呢,一定要好清楚,各位同学啊,老师花了一点时间把这个做了一个分析,一定要注意这个这句话啊,斜管道和无管道的频率不一致无所谓,但是一定要让它动起来。好,同学们,我就讲了一个主色,好,先截取一段视频。
我来说两句