异步队列

JavaScript可否多线程? 深入理解JavaScript定时机制

杀马特。学长 韩版系。学妹 提交于 2019-12-01 18:01:05
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了. 同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑! 但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解: div.onclick = function(){ setTimeout( function(){document.getElementById(’inputField’).focus();}, 0); }; 既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇. 直到最后某一天 , 你不小心写了一段糟糕的代码: setTimeout( function(){ while(true){} } ,

Javascript是单线程的深入分析

半腔热情 提交于 2019-12-01 18:00:50
面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚。来深入分析一下: 首先看下面的代码: 1 2 3 4 5 6 7 8 9 function foo() { console.log('first' ); setTimeout( (function(){ console.log('second' ); } ), 5); } for (var i = 0; i < 1000000; i++) { foo(); } 执行结果会首先全部输出first,然后全部输出second;尽管中间的执行会超过5ms。为什么? Javascript是单线程的 因为 JS运行在浏览器中,是单线程的,每个window一个JS线程 ,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码。而浏览器是 事件驱动的(Event driven) ,浏览器中很多行为是 异步(Asynchronized) 的,会创建事件并放入执行队列中。javascript引擎是单线程处理它的任务队列, 你可以理解成就是普通函数和回调函数构成的队列。当异步事件发生时,如mouse click, a timer firing, or an

JavaScript可否多线程? 深入理解JavaScript定时机制

百般思念 提交于 2019-12-01 18:00:35
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了. 同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑! 但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解: div.onclick = function(){ setTimeout( function(){document.getElementById(’inputField’).focus();}, 0); }; 既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇. 直到最后某一天 , 你不小心写了一段糟糕的代码: setTimeout( function(){ while(true){} } ,

【转】异步、并发、协程原理

拈花ヽ惹草 提交于 2019-12-01 17:05:47
Linux 操作系统在设计上将虚拟空间划分为用户空间和内核空间,两者做了隔离是相互独立的,用户空间给应用程序使用,内核空间给内核使用。 一、异步 应用程序和内核 内核具有最高权限,可以访问受保护的内存空间,可以访问底层的硬件设备。而这些是应用程序所不具备的,但应用程序可以通过调用内核提供的接口来间接访问或操作。所谓的常见的 IO 模型就是基于应用程序和内核之间的交互所提出来的。以一次网络 IO 请求过程中的 read 操作为例,请求数据会先拷贝到系统内核的缓冲区(内核空间),再从操作系统的内核缓冲区拷贝到应用程序的地址空间(用户空间)。而从内核空间将数据拷贝到用户空间过程中,就会经历两个阶段: 等待数据准备 拷贝数据 也正因为有了这两个阶段,才提出了各种网络 I/O 模型。 Unix/Linux的体系架构 同步和异步 同步(Synchronised)和异步(Asynchronized)的概念描述的是应用程序与内核的交互方式,同步是指应用程序发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行;而异步是指应用程序发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知应用程序,或者调用应用程序注册的回调函数。 阻塞和非阻塞 阻塞和非阻塞的概念描述的是应用程序调用内核 IO 操作的方式,阻塞是指 I/O 操作需要彻底完成后才返回到用户空间;而非阻塞是指 I

JS执行机制

浪子不回头ぞ 提交于 2019-12-01 16:37:24
1.JS 是单线程 也就是说 同一时间 只能做一件事  JavaScript 就是为了处理页面中用户的交互,以及操作 DOM 而诞生,比如某个 DOM 元素进行添加和删除,不能同时进行,应该先添加,后删除 2.单线程就意味着,所有任务需要排队,前一个任务结束 ,才能执行后一个任务。  这样导致的问题是:如果 JS执行的时间过长,这样就会造成页面渲染不连贯,导致页面渲染加载阻塞的问题 3.同步 和 异步  为解决 单线程 问题,利用多核 CPU 的计算能力,HTML5 提出Web Worker ,允许 JavaScript 脚本创建多个线程。于是,JS中出现了 同步 和 异步 。  同步:前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。   比如先烧水,等水开了(十分钟之后),再去切菜,炒菜  异步:做前一个任务时间比较长,那么在做前一个任务的同时,还可以去处理后面其他的任务。   比如在烧水的同时(利用这十分钟),还可以去切菜,炒菜   他们的本质区别:这条流水线上各个流程的执行顺序不同。 4.同步任务和异步任务的执行过程  同步任务:都在主线程上执行,形成一个执行线。  异步任务:JS 的异步是通过回调函数实现的  异步任务有三种类型:   1.普通事件, click、resize 等   2.资源加载, load、error 等   3.定时器

java IO NIO BIO 最权威的总结

帅比萌擦擦* 提交于 2019-12-01 13:43:10
1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 NIO 简介 2.2 NIO的特性/NIO与IO区别 1)Non-blocking IO(非阻塞IO) 2)Buffer(缓冲区) 3)Channel (通道) 4)Selectors(选择器) 2.3 NIO 读数据和写数据方式 2.4 NIO核心组件简单介绍 2.5 代码示例 3. AIO (Asynchronous I/O) 参考 BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。 同步和异步的区别最大在于异步的话调用者不需要等待处理结果

JavaScript异步的底层原理

白昼怎懂夜的黑 提交于 2019-12-01 10:35:53
JavaScript引擎属于单线程作业,意味着:在同一时间只能执行一个代码块,这些代码块的执行就阻塞了异步事件的处理。 因此,出现了"任务队列"(task queue),我们可以将任务分为两种:一种是 同步任务 (synchronous), 另一种是 异步任务 (asynchronous)。      同步任务: 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;     异步任务: 不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。如回调函数就是异步任务      具体来说,异步执行的运行机制如下。        (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。       (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。       (3)一旦"执行栈"中的 所有同步任务执行完毕 ,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。       (4)主线程不断重复上面的第三步。      只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制

jQuery源码分析(九) 异步队列模块 Deferred 详解

我与影子孤独终老i 提交于 2019-12-01 05:21:07
deferred对象就是jQuery的回调函数解决方案,它解决了如何处理耗时操作的问题,比如一些Ajax操作,动画操作等。(P.s:紧跟上一节:https://www.cnblogs.com/greatdesert/p/11433365.html的内容) 异步队列有三种状态:待定(pending)、成功(resolved)和失败(rejected),初始时处于pending状态 我们可以使用jQuery.Deferred创建一个异步队列,返回一个对象,该对象含有如下操作:   done(fn/arr)         ;添加成功回调函数,当异步队列处于成功状态时被调用,参数同:jQuery.Callbacks(flags).add(fn/arr)   fail(fn/arr)         ;添加失败回调函数,参数同上   progress(fn/arr)      ;添加消息回调函数,参数同上   then(donefn/arr,failfn/arr,profn/arr) ;同时添加成功回调函数、失败回调函数和消息回调函数   always(fn/arr)        ;添加回调函数到doneList和failList中,即保存两份引用,当异步队列处于成功或失败状态时被调用 ;参数可以是函数、函数列表   state()        ;返回异步队列的当前状态

系统拆分解耦利器之消息队列---RabbitMQ-Persistence Configuration

南笙酒味 提交于 2019-11-30 22:15:42
[一曲广陵不如晨钟暮鼓] 鉴于RabbitMQ官方文档的内容过多,且大部分内容在应用时基本使用默认配置,因此,后续我们将只翻译部分文档。更多内容请各位看官参考其他资料吧。 本文,我们将介绍RabbitMQ持久化配置相关的内容,废话不表,马上开始正文部分吧。 -------------------------------------------------------------------------------------------------------------------------------------------------------- Persistence Configuration RabbitMQ的持久层是为了在大多数没有配置的情况下,仍然提供相对较好的服务。但其中的一些配置,在某些情况下,是非常有用的。接下来,我们就来解释如何配置它们。强烈建议你在开始修改这些配置之前先 阅读本文相关内容 。 How persistence works 首先,在某些场景下:持久的和临时的消息都被写入到磁盘中。其中,持久的消息将在其到达队列之时就会被写入到磁盘之中,而临时的消息只会在内存不够用时,为了释放内存压力而被临时的写入磁盘当中。此时,持久化的消息也采用了同样的策略。持久层的作用是将这两种类型的消息都写入到此到磁盘当中。 在本文中我们说“队列queue

消息队列之 - 你需要使用队列吗?

青春壹個敷衍的年華 提交于 2019-11-30 21:49:51
对于消息队列,应该都不陌生。市场上很多类型的消息队列,五花八门。选择自己适合场景的消息队列并不容易。如何选择呢?这篇文章不会很简单的对比所有的队列的优劣,会从消息队列的本身的方式与优缺点,让大家觉得需不需要使用消息队列。 消息队列的架构模式 消息代理定义:消息代理是一种架构模式,用于消息验证、变换、路由。调节应用程序的通信,极小化互相感知(依赖),有效实现解耦合。例如,消息代理可以管理一个工作负荷队列或消息队列,用于多个接收者,提供可靠存储、保证消息分发、以及事务管理。来自维基百科( https://zh.wikipedia.org/wiki/%E6%B6%88%E6%81%AF%E4%BB%A3%E7%90%86 )。 简单的来说,消息代理是消息队列的一种架构模式,一般消息队列都会使用。包括:ActiveMQ、Kafka、RocketMQ、RabbitMQ等。 消息代理的方式 消息代理的方式有:直接点对点方式、发布订阅、定制路由规则。 直接点对点方式 这种方式中,生产者发送(放入)消息,消费者直接消费消息。在消息代理的角度,路由由队列名称定位,生产者与消费者只需要知道队列名称即可。如下图,展示了一个生产者放入消息队列,一个消费者负责消费。 当然,如果流量大,则可以多个生产者与消费者。由于都使用同一消息队列名称,所以可以在生产与消费应用程序端添加多个实例,提高处理速度。如下图