源码家族
当前位置:首页 > 资讯中心

资讯中心

【 swoole:说说你对阻塞、非阻塞的理解 】

发布时间:2021-07-14 09:29:44 阅读次数:82

大家在面试中,经常会被问到swoole相关问题,说说你对阻塞、非阻塞的理解


同步异步:说的是kernel返回处理信息的方法策略

针对程序中碰到耗时任务时,传递给Kernel  Kernel处理信息的方式  有异步api函数是异步 没的话是同步

IO立即返回:主函数中(task函数) 传递任务信息给Kernel,Kernels收到(onTask函数),这个耗时任务我完成之后我会再告诉你的(onFinish) 这是异步

IO完成之后返回:这个是同步 就是一个return即可!

堵塞非堵塞:说的是应用程序执行耗时任务的状态 

针对的是程序中碰到耗时任务主程序的运行会不会wait 

不wait就是非堵塞  wait就是堵塞  是说的一个程序的一个任务点状态!

例子
小张喜欢喝咖啡,同时养了好多狗;
要完成的事情:小张煮咖啡然后喝咖啡
1.小张:  application
2.咖啡壶:kernel 内核
3.煮咖啡:耗时任务
4.小狗大黑:查询信息流 send() rev()
5.小狗大黄:查询信息流 send() rev()
6.小狗大白大红:查询信息流 send() rev()  
 
同步阻塞:
小张派大黑去看咖啡煮好没,大黑等咖啡煮开了(同步)才回来,
小张也一直在等待(堵塞) ;
 
同步非阻塞:
小张派大黄去看咖啡煮好没,大黄看了一眼就回来了,过了一会,大黄再去看看咖啡煮好没(异步),
小张啥也没有干,还是一直等着(同步)
 
异步非阻塞:
小张派大白和大红去看咖啡煮好没,煮咖啡是task,小张就开始看电视了(非堵塞)
大白和大红到了厨房后,大白就回来告诉小张,大红已经到厨房啦(onTask异步);
过了一会咖啡煮好了,大红回到客厅告诉小张(onFinish)
 
异步阻塞:
小张派大白和大红去看咖啡煮好没,煮咖啡是task,小张心很急非要一直等着 就开始等着信息(堵塞)
大白和大红到了厨房后,大白就回来告诉小张,大红已经到厨房啦,咖啡煮着呢 (onTask异步);
过了一会咖啡煮好了,大红回到客厅告诉小张(onFinish)
小张这才放松了,继续干其他的了!感觉有些焦虑啊!
图示




 



从上面的图可以看出来,其实不管是任何模式,内核的处理方式都是一样的,都是
1. wait for data(等待数据);
2. copy data from kernel to user(拷贝数据到用户层)。
而产生这三种模式的差别在于中间使用的api函数不同。


上一篇:Go语言type关键字
下一篇:Go语言注释的定义及使用