异步队列

集千篇理论精华,感悟对同步和异步的理解

核能气质少年 提交于 2019-12-03 23:48:40
一、promise本身是同步还是异步呢? 众所周知,Promise是ES6提出的解决异步编程导致陷入回调地狱问题的,那么Promise是同步的还是异步的?可以确定的是,Promise本身是同步的,而他的.then和.catch为异步的。 举个栗子: console.log(1) let a = new Promise((res,rej) => { console.log(2); }); console.log(3); let b = new Promise((res,rej) => { console.log(4); }); console.log(5); //1,2,3,4,5 二、返回的异步代码执行顺序 (.then / .catah) console.log(1) let a = new Promise((res,rej) => { console.log(2); res(); }); console.log(3); let b = new Promise((res,rej) => { console.log(4); res(); }); console.log(5); a.then(() => { //先执行a,是因为.then是一个微任务,而且a最先进入微任务队列,所以现在执行a,在执行b,但都必须是在等到同步代码结束之后在进入执行队列; console.log(6) }

JavaScript 运行机制详解:再谈Event Loop

南笙酒味 提交于 2019-12-03 21:22:03
一年前,我写了一篇 《什么是 Event Loop?》 ,谈了我对Event Loop的理解。 上个月,我偶然看到了Philip Roberts的演讲 《Help, I'm stuck in an event-loop》 。这才尴尬地发现,自己的理解是错的。我决定重写这个题目,详细、完整、正确地描述JavaScript引擎的内部运行机制。下面就是我的重写。 进入正文之前,插播一条消息。我的新书 《ECMAScript 6入门》 出版了( 版权页 , 内页1 , 内页2 ),铜版纸全彩印刷,非常精美,还附有索引(当然价格也比同类书籍略贵一点点)。预览和购买点击 这里 。 (2014年10月13日更新:本文已经做了较大修改,反映了我现在的认识。关于setTimeout的更多解释和示例,请参阅我正在写的 《JavaScript标准参考教程》 。) (2014年10月11日更新:朴灵老师对本文做了 评注 ,详细得指出了文中存在的错误说法,建议阅读。) 一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程

async函数

自闭症网瘾萝莉.ら 提交于 2019-12-03 17:01:52
一.什么是async函数 1. 概念 async函数是co(Generator)函数的语法糖。 语法是将Generator函数的*替换为async; yield替换为await; var fnName = async function() { let result = await Promise.resolve(1); console.log(result); //1 } fnName(); // 相当于 const co = require('co'); co(function* fnName() { let result = yield Promise.resolve(1); console.log(result); //1 }) async函数相当于执行器+Generator函数,原理如下: async function fn() { //.... } // 模拟源码实现 function fn() { // run+Generator--等同于co + Generator return run(function* (){ }) } function run(fn) { return new Promise((resolve,reject) => { const gen = fn(); function next(nextFn) { let next; try { next

Celery介绍和基本使用

…衆ロ難τιáo~ 提交于 2019-12-03 15:35:09
Celery介绍和基本使用 Celery是一个基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用celery,举几个实例场景中可用的例子: 你想对100台机器执行一条批量命令,可能会花很长时间,但你不想让你的程序等着结果返回,而是给你返回一个任务ID,你过段时间只需要拿着这个任务ID就可以拿到任务执行结果,在任务执行ing进行时,你可以继续做其他的事情。 2.你想做一个定时任务,比如每天检测一下你们所有客户到资料,如果发现今天是客户生日,就给它发个短信祝福. Celery在执行任务时需要通过一个消息中间件来接收和发送消息,以及存储任务结果,一般会使用rabbitMQ or Redis, Celery有以下优点: 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的。 高可用:当任务执行失败或者执行过程中发生连接中断,celery会自动尝试重新执行任务 快速:一个单进程的celery每分钟可处理上百万个任务 灵活:几乎celery的各个组件都可以被扩展及自定制 Celery基本工作流程图 https://www.cnblogs.com/alex3714/articles/6351797.html 来源: https://www.cnblogs.com/venvive/p/11802483

简述同步和异步,以及js的任务队列.

左心房为你撑大大i 提交于 2019-12-03 04:34:51
javascript是单线程的一门语言,所以在执行任务的时候,所有任务必须排队,然后一个一个的执行.这就是同步模式   所以同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;   异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。 所以js的运行机制是这样的:   (1): 所有同步任务都在主线程上执行,形成一个执行栈.   (2): 主线程之外,还存在一个"任务队列"(task queue)。异步任务进入任务队列等待主线程执行完毕.   (3): 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",对应的异步任务结束等待状态,进入执行栈,开始执行。   怎么知道主线程任务为空: JS引擎中存在monitoring process进程,它会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数 来源: https://www.cnblogs.com/byyoki/p/11777579.html

Promise相关

≯℡__Kan透↙ 提交于 2019-12-03 02:37:55
Promise相关 关于异步: 出现背景: 由于JS是单线程语言,因此所有网络操作、浏览器事件都必须是异步执行的。 异步解决方案: 方案一:回调函数方式(注册-执行异步任务-触发回调函数) 原理: 浏览器解释执行js代码过程中,遇到异步任务,首先在系统中挂起(异步队列中注册回调函数),当异步任务(eg:I/O,网络请求等操作完成之后),通过触发回调函数的方式完成整个异步操作。 异步的问题: 传统采用回调函数处理异步任务的方式可以处理问题,但可能进入回调地狱,剥夺return的权利 回调方式,代码嵌套层次深,易读性差,且不易维护 场景: setTimeOut ajax请求 方案二:Promise方式 概念: Promise是一个对象:承诺将来会执行的对象(代表异步操作最终成功或者失败) promise作为队列最为重要的特性,我们在任何一个地方生成了一个promise队列之后,我们可以把他作为一个变量传递到其他地方。 三种状态:pending、fulfilled、rejected 两类函数:resolve(),将pending状态变为fulfilled状态,rejecte(),将pending状态变为rejected状态 thenable对象:具有特定格式then属性的对象 约定(与传统回调函数不同): 本轮Event Loop完成之前,回调函数不会被调用 then函数总会被调用

服务器高并发设计模式

旧街凉风 提交于 2019-12-03 01:39:49
半同步/半异步模式 先解释一下同步和异步的区别,与刚才I/O的同步、异步不一样,在并发模式中,这里的“同步"指的是程序完全按照代码的顺序执行,“异步”指的是程序的执行需要由系统事件来驱动,比如说信号、中断等。下图就清楚的解释了同步和异步操作的过程: 这样看来,显然 异步线程的执行效率高,但是它的编写相对复杂,难于调试 ,然而 同步线程刚好相反,逻辑简单,但效率较差 。半同步/半异步模式就结合了同步线程与异步线程的优点, 它在处理I/O事件时使用异步线程,处理客户逻辑则使用同步线程 。这样既满足了客户连接的实时性,又能同时处理多个连接。那么它是如何同将同步与异步结合起来的?实现半同步/半异步模式需要三个模块: 异步处理模块、同步处理模块和队列模块 。 举个例子: "一家律师事务所有一个前台接待员,每一位想寻找律师的客户,都会先由接待员接待,接待员会给每位顾客都安排一个律师来处理客户的案件,(假设一个律师在同一时间只能处理一个客户的案子)接待员只有一个人,但他可以接待所有客户,不过它也只负责接待,哪怕你的案件再复杂,都是律师的事儿,跟接待员没关系,而分配的依据可以是预约情况或者案件类型。" 在上面这个例子中,那个前台接待员就是异步处理模块,他一个人要处理多个I/O请求(客户),律师则是同步处理模块,每一个律师分别对应一个客户,根据客户的不同需求作出处理,而要让异步模块与同步模块连接起来

同步异步傻傻分不清楚(前端菜鸟升级)

匿名 (未验证) 提交于 2019-12-03 00:26:01
对于像我这样的新手来说,同步异步,js执行原理,浏览器运行机制都有些模糊不清,但在工作的过程中遇见了许多问题没办法啊,只能去弄清楚。 首先浏览器里面是有多个进程的,每个进程里面又有多个线程。然后每次打开一个页面都会有一个render进程,也就是我们最关心的渲染进程。这个进程里面包括几个重要的线程:GUI渲染线程、js引擎线程、事件触发线程、定时器触发线程、异步http请求线程。 我们通常说js是单线程的,指的就是就是js引擎线程,它是render进程里的主线程,执行js代码。它执行结束前,其他的线程可以处理任务,但是最后都要等待主线程执行结束才能继续后续操作(特别是GUI渲染线程和js引擎线程是互斥的,就是先不执行js引擎线程里的重复操作DOM的代码)。 上面没看懂没关系,你只需要知道render进程里有多个线程,而我们js引擎线程就是我们通常说的主线程和单线程js,进入正题,那么在主线程里是如何执行js代码的呢? 首先你要知道什么是同步任务和异步任务,所谓的同步任务就是按顺序执行的任务,就是我这段代码没执行完后面的代码就不会执行。其中包括容易混淆的for循环等各种循环,以及function等(循环和function里都没有异步任务),看一下以下的例子。 //代码说明 f1(list){ console.log('function',list[0]) console.log(

async函数

匿名 (未验证) 提交于 2019-12-03 00:17:01
一.什么是async函数 1. 概念 async函数是co(Generator)函数的语法糖。 语法是将Generator函数的*替换为async; yield替换为await; var fnName = async function() { let result = await Promise.resolve(1); console.log(result); //1 } fnName(); // 相当于 const co = require('co'); co(function* fnName() { let result = yield Promise.resolve(1); console.log(result); //1 }) async函数相当于执行器+Generator函数,原理如下: async function fn() { //.... } // 模拟源码实现 function fn() { // run+Generator--等同于co + Generator return run(function* (){ }) } function run(fn) { return new Promise((resolve,reject) => { const gen = fn(); function next(nextFn) { let next; try { next

异步I/O

匿名 (未验证) 提交于 2019-12-03 00:11:01
1.文件操作 2.网络操作 1.定时任务 2.事件处理 3.Ajax回调处理 引入事件队列机制 Node.js中的事件模型与浏览器中的事件模型类似 单线程+事件队列(JS的运行是单线程的,但是Node.js的环境和浏览器的环境是多线程的) Node.js中异步执行的任务: 1.文件I/O 2.网络I/O Node.js是基于回调函数的编码风格 来源:博客园 作者: 浮华夕颜 链接:https://www.cnblogs.com/zcy9838/p/11590087.html