问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

什么是阻塞输入,什么是非阻塞输入?

发布网友 发布时间:2022-04-23 18:38

我来回答

3个回答

懂视网 时间:2022-04-23 23:00

现代浏览器中的<script>标签分成了两种新类型:经典型和非阻塞型。接下来讨论如何运用这两种标签来尽快加载页面。

1、阻塞型脚本何去何从?

标准版本的<script>标签常常被称作阻塞型标签。这个词必须放在上下文中进行理解:现代浏览器看到阻塞型<script>标签时,会跳过阻塞点继续读取文档及下载其他资源(脚本和样式表)。但直到脚本下载完毕并运行之后,浏览器才会评估阻塞点之后的那些资源。因此,如果网页文档的<head>标签里有5 个阻塞型<script>标签,则在所有这5 个脚本均下载完毕并运行之前,用户除了页面标题之外看不到任何东西。不仅如此,即便这些脚本运行了,它们也只能看到阻塞点之前的那部分文档。如果想看到<body>标签中正等待加载的那些好东西,就必须给像document.onreadystatechange 这样的事件绑定一个事件处理器。

基于上述原因,现在越来越流行把脚本放在页面<body>标签的尾部。这样,一方面用户可以更快地看到页面,另一方面脚本也可以主动亲密接触DOM 而无需等待事件来触发自己。对大多数脚本而言,这次“搬家”是个巨大的进步。

但并非所有脚本都一样。在向下搬动脚本之前,请先问自己2 个问题。

该脚本是否有可能被<body>标签里的内联JavaScript 直接调用?答案可能一目了然,但仍值得核查一遍。

该脚本是否会影响已渲染页面的外观?Typekit 宿主字体就是一个例子。如果把Typekit 脚本放在文档末尾,那么页面文本就会渲染两次,即读取文档时即刻渲染,脚本运行时再次渲染。

上述问题只要有一个答案是肯定的,那么该脚本就应该放在<head>标签中,否则就可以放在<body>标签中,文档形如:

<html>
<head>
 <!--metadata and stylesheets go here -->
 <script src="headScripts.js"></scripts>
</head>
<body>
 <!-- content goes here -->
 <script src="bodyScripts.js"></script>
</body>
</html>

这确实大大缩短了加载时间,但要注意一点,这可能让用户有机会在加载bodyScripts.js 之前与页面交互。

2、 脚本的提前加载与延迟运行

上面建议将大多数脚本放在<body>中,因为这样既能让用户更快地看到网页,又能避免操控DOM之前绑定“就绪”事件的开销。但这种方式也有一个缺点,即浏览器在加载完整个文档之前无法加载这些脚本,这对那些通过慢速连接传送的大型文档来说会是一大瓶颈。

理想情况下,脚本的加载应该与文档的加载同时进行,并且不影响DOM 的渲染。这样,一旦文档就绪就可以运行脚本,因为已经按照<script>标签的次序加载了相应脚本。

如果大家已经读到这里了,那么一定会迫不及待地想写一个自定义Ajax 脚本加载器以满足这样的需求!不过,大多数浏览器都支持一个更为简单的解决方案。

<script defer src = "deferredScript.js">

添加defer(延迟)属性相当于对浏览器说:“请马上开始加载这个脚本吧,但是,请等到文档就绪且所有此前具有defer 属性的脚本都结束运行之后再运行它。”在文档<head>标签里放入延迟脚本,既能带来脚本置于<body>标签时的全部好处,又能让大文档的加载速度大幅提升!

不足之处就是,并非所有浏览器都支持defer属性。这意味着,如果想确保自己的延迟脚本能在文档加载后运行,就必须将所有延迟脚本的代码都封装在诸如jQuery 之$(document).ready 之类的结构中。

上一节的页面例子改进如下:

<html>
<head>
 <!-- metadata and stylesheets go here -->
 <script src="headScripts.js"></scripts>
 <script defer src="deferredScripts.js"></script>
</head>
<body>
 <!-- content goes here -->
</body>
</html>

请记住deferredScripts 的封装很重要,这样即使浏览器不支持defer,deferredScripts 也会在文档就绪事件之后才运行。如果页面主体内容远远超过几千字节,那么付出这点代价是完全值得的。

3、 脚本的并行加载

如果你是斤斤计较到毫秒级页面加载时间的完美主义者,那么defer也许就像是淡而无味的薄盐酱油。你可不想一直等到此前所有的defer 脚本都运行结束,当然也肯定不想等到文档就绪之后才运行这些脚本,你就是想尽快加载并且尽快运行这些脚本。这也正是现代浏览器提供了async(异步)属性的原因。

<script async src = "speedyGonzales.js">
<script async src = "roadRunner.js">

如果说defer 让我们想到一种静静等待文档加载的有序排队场景,那么async 就会让我们想到混乱的无政府状态。前面给出的那两个脚本会以任意次序运行,而且只要JavaScript 引擎可用就会立即运行,而不论文档就绪与否。
对大多数脚本来说,async 是一块难以下咽的鸡肋。async 不像defer那样得到广泛的支持。同时,由于异步脚本会在任意时刻运行,它实在太容易引起海森堡蚁虫之灾了(脚本刚好结束加载时就会蚁虫四起)。
当我们加载一些第三方脚本,而且也不在乎它们谁先运行谁后运行。因此,对这些第三方脚本使用async 属性,相当于一分钱没花就提升了它们的运行速度。
上一个页面示例再添加两个独立的第三方小部件,得到的结果如下:

<html>
<head>
 <!-- metadata and stylesheets go here -->
 <script src="headScripts.js"></scripts>
 <script src="deferredScripts.js" defer></script>
</head>
<body>
 <!-- content goes here -->
 <script async defer src="feedbackWidget.js"></script>
 <script async defer src="chatWidget.js"></script>
</body>
</html>

这个页面结构清晰展示了脚本的优先次序。对于绝大多数浏览器,DOM的渲染只会延迟至headScripts.js 结束运行时。进行DOM渲染的同时会在后台加载deferredScripts.js。接着,在DOM 渲染结束时将运行deferredScripts.js 和那两个小部件脚本。这两个小部件脚本在那些支持async 的浏览器中会做无序运行。如果不确定这是否妥当,请勿使用async!

热心网友 时间:2022-04-23 20:08

“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。
1.同步与异步
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。

而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

典型的异步编程模型比如Node.js

举个通俗的例子:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

2. 阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

热心网友 时间:2022-04-23 21:26

像scanf , gets 这些函数都是阻塞方式的。
一经调用,程序就停在那里不动直到有输入

而非阻塞方式是指在接受输入时不会停在输入函数那里

比如func为输入函数,返回值为实际输入的数据长度
retLen = func(。。。)
如果func为阻塞函数那么执行到该函数时程序会停留在这句话一直到从终端接收到数据才会跳转掉下句

如果为非阻塞,那么程序不会停止这句,而程序员可通过判断retLen的值来知道有没有输入数据
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航用电脑软件哪个好导航软件哪个最准确 我要地图网使用我要地图网轻松查询地图信息 装配行业MES系统四大车间管理活动介绍 王者荣耀S14狂铁怎么玩_王者荣耀S14狂铁出装铭文推荐 沅陵县有姓文的分布在那个地方, 汨罗一中在省排名 汨罗高中有哪些? 湖南省岳阳市汨罗有哪些高中 新生儿脊膜膨出后遗症 在深圳硬脊膜膨出手术后大小便失禁怎么办? 草头下面一个貌什么字? 草头加貌读什么子 草字头,一个貌 草字头下面有个貌读什么 布料的衣服第一次洗退色了怎么办 计算机软件开发问题 我想知道的是学计算机软件做科研的平时都是在做什么?和在公司做软件开发项目的有什么样的区别? 计算机软件开发类 哇哦大鸡排加盟条件和加盟费用是多少 测量学基本技能有哪些? 工程测量学的概念是什么? 测量学的任务和作用是什么? 谈谈你对测量学的认识 什么是测量学 什么叫测量学 什么是测量学? 莎车县哪个乡最好?县里的学校多吗?我们明年要去支教,想问一下,哪个乡的学校多?那个学校的条件好? 莎车县依盖尔其14村离莎车县有多远 喀什叶河旅游开发有限责任公司怎么样? 莎车县户口 投职简历怎么写 北京交通大学自考人力资源管理试题下载 北京大学自考本科人力资源管理都考哪些 自考人力资源管理怎样复习? 关于北京自考 人力资源管理考试科目的问题 新生儿肺炎拉肚子 b站有什么好看的纪录片 求几部好看的,经典的番,要求能在b站,腾讯视频,u酷上能看 B站里有没好看的死神火影视频 b站看见一个很好看的fade视频,最后是一个人穿着特别的衣服跳起来导电 求助诺基亚手机H5230-00怎样看是真假,手机序列号是356051036150594 急急急! 三星冰箱230mmgf出现h5 b站好看吗? 长城h5胎压195kpa正常吗 天天象棋230关怎么过 哈弗H5和东风风神AX7哪个好 比较便宜的四驱轿车有哪些 天天象棋战国七雄第230关攻略 闯关230关怎么过 三星冰箱BCD230/MMGF故障代码 芳烃亲电取代磺化的磺化试剂是否可以用某种通式来表达反应质点