异步队列

JavaScript 运行机制详解:Event Loop

不想你离开。 提交于 2019-12-29 02:39:28
转自: http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript运行机制

回眸只為那壹抹淺笑 提交于 2019-12-29 02:38:53
一、引子 本文介绍JavaScript运行机制,这一部分比较抽象,我们先从一道面试题入手: 1 2 3 4 5 6 console . log ( 1 ) ; setTimeout ( function ( ) { console . log ( 3 ) ; } , 0 ) ; console . log ( 2 ) ; 请问数字打印顺序是什么? 这一题看似很简单,但如果你不了解JavaScript运行机制,很容易就答错了。题目的答案是依次输出1 2 3,如果你有疑惑,下文有详细解释。 二、理解JS的单线程的概念 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 三、理解任务队列(消息队列) 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务

单线程JavaScript

耗尽温柔 提交于 2019-12-29 02:38:42
最近在阅读《你不知道的JavaScript中卷》,当我看到第二部分介绍异步和回调函数的一些知识时,由于该书在第二部分1、2章对线程、事件循环的概念介绍的并非详细,因此引发了我的一系列思考。于是写下这篇小文章,记录自己对该知识点的学习和思考。 javascript单线程 由于JavaScript是单线程语言,因此,在一个进程上,只能运行一个线程,而不能多个线程同时运行。也就是说JavaScript不允许多个线程共享内存空间。因此,如果有多个线程想同时运行,则需采取排队的方式,即只有当前一个任务执行完毕,后一个任务才开始执行。 任务队列 在JavaScript中,所有任务可以分为两种,一种是同步任务,一种是异步任务。 同步任务 指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,后一个任务才会执行; 异步任务 指的是不进入主线程、而进入任务队列的任务,只有当主线程上的所有同步任务执行完毕之后,主线程才会读取任务队列,开始执行异步任务。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务不得不一直等待。那么这样的JavaScript的执行不是很慢吗?特别是对于长时间任务执行的时候,那么其他的任务就得不到执行。考虑这种原因,JS中将这些耗时的I/O等操作封装成了异步的方法,也就是通过 回调函数 的方式。等到同步任务执行完毕

javaScript异步编程

一曲冷凌霜 提交于 2019-12-29 02:38:11
一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。 JavaScript语言的设计者意识到

深入理解Javascript单线程谈Event Loop

此生再无相见时 提交于 2019-12-29 02:37:22
假如面试回答 js 的运行机制时,你可能说出这么一段话: “Javascript 的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件。 ” 但你能说出背后的原因吗? 1. 线程与进程 进程 :是系统资源分配和调度的单元。一个运行着的程序就对应了一个进程。一个进程包括了运行中的程序和程序所使用到的内存和系统资源。 线程 :线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程。 2.同步和异步 同步和异步关注的是 : 消息 ( 结果 ) 通信机制。 同步 : 发出调用 后 ,在没有得到结果前,该调用不返回。但是一旦调用返回,就得到返回值 异步 : 发出调用后,调用直接返回,没有返回结果。但结果由回调函数给出,至于什么时候给出,不知道。(这个回调函数肯定是在当前 js 执行完后才执行) 3.阻塞与非阻塞 阻塞和非阻塞关注的是 : 程序在等待调用结果时的 状态 . 阻塞调用 : 调用结果返回之前,当前线程被挂起。调用线程只有在得到结果后才会返回。 非阻塞调用 : 在不能立刻得到结果之前,该调用不会阻塞当前线程。 4. 为什么 JavaScript 是单线程? JavaScript 是 单线程 ,程序按照顺序排列,前面的必须处理好,后面的才会执行。 JavaScript

Flutter开发系列(三)--Dart异步机制与异步编程

妖精的绣舞 提交于 2019-12-28 07:01:04
Dart是单线程语言,但是请求网络,数据操作和IO操作等耗时操作需要异步,否则可能会导致无响应。Isolate机制是Dart中的异步机制。与Java中的线程不同,Isolate中的线程(可以先称之为线程)是内存隔离的(像进程一样的线程),而Java中的线程是内存共享的。 Dart中的main函数启动时会启动一个进程(可先称之为主线程,或者主isolate)。使用Isolate.spawn可以创建一个新的Isolate。 import 'dart:io'; import 'dart:isolate'; int i; void main() { i = 2; Isolate.spawn(entryPoint, "hello");//开启一个子Isolate } //entryPoint相当于在一个新的子线程中执行 void entryPoint(Stirng message) { print(i); //输出为null,而非2,也说明了主isolate与子isolate内存隔离,无法共享 sleep(Duration(seconds: 10)); //子isolate延迟,不会影响主isolate print(message); } 消息接收器和消息发送器即ReceivePort和SendPort,它们在每个isolate中均存在

聊聊IOCP,聊聊异步编程

∥☆過路亽.° 提交于 2019-12-28 03:53:23
/*--> */ /*--> */ /*--> */ /*--> */ 前言 IO完成端口(IO completion ports)在多核计算机的并行异步IO请求方面提供了一种高效的线程模型。当进程创建一个IO完成端口时,系统创建一个相关联的队列,其唯一目的是服务与那些请求。IO完成端口通常和预先分配的线程池配合,相比于一个一个创建线程,这使其更快更高效。IOCP在进程之间并不共享,一个IOCP及其句柄只和创建它的进程关联,但是一个进程中的多个线程可共享。IOCP最关键的地方就是,IOCP在IO请求和接收动作完成之后,激活线程池中的任意线程继续操作,而不是在IO请求和接受完成之后,激活原等待中的线程。这样的好处是防止等待线程闲置,和必须激活/切换到原等待线程的开销。 大多应用存在的问题 曾见过很多服务,几台,几十台,几百台服务器的,它们cpu大多数时间处于空闲状态,也许需要大量计算的应用并没有那么多,我们常见的应用大多主要读写关系数据库,读写内存数据库/缓存,RPC调用接口。IO耗时过多,CPU大量闲置,导致没看到服务器资源大量消耗,便已不能承受日益增加的访问量,再加服务器,依然大量浪费了资源。 CPU资源昂贵,每一个核心,同一时刻只能有一个线程在运行,超线程cpu同一时刻可以有两个逻辑线程运行,所以说线程不是创建的越多越好,过多的线程只会增加线程切换带来的成本。试想一下

Dart异步模型

我的梦境 提交于 2019-12-28 01:46:48
Dart汇总请点击 这里 同步代码和异步代码; 同步代码:就是一行行写下来的代码 异步代码:就是以Future等修饰的代码 这两类代码的不同 1.运行顺序不同 同步代码和异步代码运行的顺序是不同的: 先运行同步代码,在运行异步代码 复制代码就是,即使我异步代码写在最前面,同步代码写在最后面,我也是先运行后面的同步代码,同步代码都运行完后,在运行前面的异步代码。 一下代码的输出结果是什么? import 'dart:async' ; main ( ) { print ( 'main #1 of 2' ) ; scheduleMicrotask ( ( ) = > print ( 'microtask #1 of 2' ) ) ; new Future . delayed ( new Duration ( seconds : 1 ) , ( ) = > print ( 'future #1 (delayed)' ) ) ; new Future ( ( ) = > print ( 'future #2 of 3' ) ) ; new Future ( ( ) = > print ( 'future #3 of 3' ) ) ; scheduleMicrotask ( ( ) = > print ( 'microtask #2 of 2' ) ) ; print ( 'main #2

Servlet 3.0 实战:异步 Servlet 与 Comet 风格应用程序

女生的网名这么多〃 提交于 2019-12-27 20:23:20
概述 作为 Java EE 6 体系中重要成员的 JSR 315 规范,将 Servlet API 最新的版本从 2.5 提升到了 3.0,这是近 10 年来 Servlet 版本号最大的一次升级,此次升级中引入了若干项令开发人员兴奋的特性,如: 可插拔的 Web 架构(Web framework pluggability)。 通过 Annotations 代替传统 web.xml 配置文件的 EOD 易于开发特性(ease of development)。 Serlvet 异步处理支持。 安全性提升,如 Http Only Cookies、login/logout 机制。 其它改进,如文件上传的直接支持等。 其中,在开源社区中讨论得最多的就是 Servlet 异步处理的支持,所谓 Servlet 异步处理,包括了非阻塞的输入/输出、异步事件通知、延迟 request 处理以及延迟 response 输出等几种特性。这些特性大多并非 JSR 315 规范首次提出,譬如非阻塞输入/输出,在 Tomcat 6.0 中就提供了 Advanced NIO 技术以便一个 Servlet 线程能处理多个 Http Request,Jetty、GlassFish 也曾经有过类似的支持。但是使用这些 Web 容器提供的高级特性时,因为现有的 Servlet API 没有对这类应用的支持

Servlet 3.0 实战:异步 Servlet 与 Comet 风格应用程序

我们两清 提交于 2019-12-27 20:23:04
简介:   自 JSR 315 规范(即 Servlet 3.0)的草案公开发布以来,最新一代 Servlet 规范的各种新特性被越来越多的开发人员所关注。规范中提到的一系列高级目标:如可插拔的 Web 框架、便捷开发特性、增强安全性支持等都令人期待。但其中关注程度最高的,毫无疑问是异步 Servlet。本文将详细介绍 Comet 风格应用的实现方式,以及 Servlet 3.0 中的异步处理特性在 Comet 风格程序中的实际应用。 概述 作为 Java EE 6 体系中重要成员的 JSR 315 规范,将 Servlet API 最新的版本从 2.5 提升到了 3.0,这是近 10 年来 Servlet 版本号最大的一次升级,此次升级中引入了若干项令开发人员兴奋的特性,如: 可插拔的 Web 架构(Web framework pluggability)。 通过 Annotations 代替传统 web.xml 配置文件的 EOD 易于开发特性(ease of development)。 Serlvet 异步处理支持。 安全性提升,如 Http Only Cookies、login/logout 机制。 其它改进,如文件上传的直接支持等。 其中,在开源社区中讨论得最多的就是 Servlet 异步处理的支持,所谓 Servlet 异步处理,包括了非阻塞的输入/输出、异步事件通知