异步队列

js 异步执行顺序

江枫思渺然 提交于 2020-02-07 00:59:05
参考文章: js 异步执行顺序 1.js的执行顺序,先同步后异步 2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列 3.调用Promise 中的resolve,reject属于微任务队列,setTimeout属于宏任务队列 注意以上都是 队列,先进先出。 微任务包括 `process.nextTick` ,`promise` ,`MutationObserver`。 宏任务包括 `script` , `setTimeout` ,`setInterval` ,`setImmediate` ,`I/O` ,`UI rendering`。 题目1: console.log('script start') async function async1() { await async2() console.log('async1 end') } async function async2() { console.log('async2 end') } async1() setTimeout(function() { console.log('setTimeout') }, 0) new Promise(resolve => { console.log('Promise') resolve() }) .then(function() {

并发,并行,异步,多线程

痞子三分冷 提交于 2020-02-05 13:29:48
文章目录 例子一 例子二 例子三 进程与线程 进程和线程的关系 个人理解 异步与多线程 基本概念 深层次理解 多线程和异步操作的异同 异步操作的本质 线程的本质 异步操作的优缺点 多线程的优缺点 适用范围 并发、并行和多线程的关系 小结 例子一 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半,电话来了,你 停了下来接了电话,接完后继续吃饭 ,这说明你支持并发。 (不一定是同时的) 你吃饭吃到一半,电话来了,你一边 打电话一边吃饭 ,这说明你支持并行。 例子二 并发是两个队列,使用一台咖啡机,并行是两个队列,使用两台咖啡机。如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。 例子三 去吃虾滑,一个师傅有2个锅子。师傅同时做经典虾滑和牛肉虾滑,类似于(周伯通左右互搏)是并行。一旦师傅停下一方去做另外一方,那就是并发。 我觉得边吃饭边打电话是一个核心,多台处理器同时处理多个任务是多个核心。应该说并行的判断条件是 同一时间点能处理多个事件 。 进程与线程 1、 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体

大白话五种IO模型

微笑、不失礼 提交于 2020-02-04 12:57:12
目录 大白话五种IO模型 一、I/O模型介绍 二、阻塞I/O模型 2.1 一个简单的解决方案 2.2 该方案的问题 2.3 改进方案 2.4 改进后方案的问题 三、非阻塞I/O模型 3.1 非阻塞I/O实例 四、多路复用I/O模型 4.1 select/poll模型 4.1.1 select网络I/O模型 4.1.2 select监听fd变化的过程分析 4.1.3 该模型的优点 4.1.4 该模型的缺点 4.2 epoll模型(了解) 五、信号驱动I/O模型(了解) 六、异步I/O模型 七、I/O模型比较分析 大白话五种IO模型 一、I/O模型介绍 为了更好地了解I/O模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) I/O和异步(asynchronous) I/O,阻塞(blocking) I/O和非阻塞(non-blocking)I/O分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous I/O和non-blocking I/O是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network I/O。本文最重要的参考文献是Richard

Nodejs之路:异步I/O的过程

好久不见. 提交于 2020-02-04 07:58:27
对于Node中的异步I/O调用,从发出调用到回调执行,看起来像普通的js异步,但是流程却和普通js那些消息队列完全不同,整个过程经历了哪些? 下面以Windows平台下为例: 一,异步调用第一阶段: 1,首先JavaScript调用Node的核心模块,核心模块再调用C++内建模块,内建模块通过libuv进行系统调用。(这里的libuv是抽象封装层,使得平台兼容性的判断都由这一层来实现,并保证上层的Node与下层的自定义线程及IOCP之间互相独立。Node在编译期间会判断平台条件,选择性编译unix目录或是win目录下的源文件到目标程序中。) 内建模块调用过程中,会创建一个FSReqWrap 请求对象 ,从JavaScript层传入的参数和当前方法都被封装在这个请求对象中,而回调函数则被设置在这个请求对象的oncomplete_sym属性上。 2,对象包装完毕后,在Windows下,则调用QueueUserWorkItem()方法将这个FSReqWrap请求对象推入线程池中等待执行,该方法使用代码如下: QueueUserWorkItem( &uv_fs_thread_proc, req, WT_EXECUTEDEFAULT ) 这个方法接收三个参数,第一个是将要执行的方法的引用,这里的例子是uv_fs_thread_proc, 这里实际上就是要执行的I/O操作实际对应的方法

理解I/O Completion Port(完成端口)

只谈情不闲聊 提交于 2020-02-04 05:51:45
理解I/O Completion Port(完成端口) 欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术: I/O端口 同步/异步 堵塞/非堵塞 服务端/客户端 多线程程序设计 Winsock API 2.0 在这之前,我曾经开发过一个项目,其中一块需要网络支持,当时还考虑到了代码的可移植性,只要使用select,connect,accept,listen,send还有recv,再加上几个#ifdef的封装以用来处理Winsock和BSD套接字[socket]中间的不兼容性,一个网络子系统只用了几个小时很少的代码就写出来了,至今还让我很回味。那以后很长时间也就没再碰了。 前些日子,我们策划做一个网络游戏,我主动承担下网络这一块,想想这还不是小case,心里偷着乐啊。网络游戏好啊,网络游戏为成百上千的玩家提供了乐趣和令人着秘的游戏体验,他们在线上互相战斗或是加入队伍去战胜共同的敌人。我信心满满的准备开写我的网络,于是乎,发现过去的阻塞同步模式模式根本不能拿到一个巨量多玩家[MMP]的架构中去,直接被否定掉了。于是乎,就有了IOCP,如果能过很轻易而举的搞掂IOCP,也就不会有这篇教程了

理解I/O Completion Port(完成端口)

狂风中的少年 提交于 2020-02-04 05:35:57
欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术:   I/O端口   同步/异步   堵塞/非堵塞   服务端/客户端   多线程程序设计   Winsock API 2.0   在这之前,我曾经开发过一个项目,其中一块需要网络支持,当时还考虑到了代码的可移植性,只要使用select,connect,accept,listen,send还有recv,再加上几个#ifdef的封装以用来处理Winsock和BSD套接字[socket]中间的不兼容性,一个网络子系统只用了几个小时很少的代码就写出来了,至今还让我很回味。那以后很长时间也就没再碰了。   前些日子,我们策划做一个网络游戏,我主动承担下网络这一块,想想这还不是小case,心里偷着乐啊。网络游戏好啊,网络游戏为成百上千的玩家提供了乐趣和令人着秘的游戏体验,他们在线上互相战斗或是加入队伍去战胜共同的敌人。我信心满满的准备开写我的网络,于是乎,发现过去的阻塞同步模式模式根本不能拿到一个巨量多玩家[MMP]的架构中去,直接被否定掉了。于是乎,就有了IOCP,如果能过很轻易而举的搞掂IOCP,也就不会有这篇教程了。下面请诸位跟随我进入正题

Android IntentService的使用和源码分析

有些话、适合烂在心里 提交于 2020-02-04 03:00:18
引言 Service服务是Android四大组件之一,在Android中有着举足重轻的作用。Service服务是工作的UI线程中,当你的应用需要下载一个文件或者播放音乐等长期处于后台工作而有没有UI界面的时候,你肯定要用到Service+Thread来实现。因此你需要自己在Service服务里面实现一个Thread工作线程来下载文件或者播放音乐。然而你每次都需要自己去写一个Service+Thread来处理长期处于后台而没有UI界面的任务,这样显得很麻烦,没必要每次都去构建一个Service+Thread框架处理长期处于后台的任务。Google工程师给我们构建了一个方便开发者使用的这么一个框架---IntentService。 IntentService简介 IntentService是一个基础类,用于处理Intent类型的异步任务请求。当客户端调用android.content.Context#startService(Intent)发送请求时,Service服务被启动,且在其内部构建一个工作线程来处理Intent请求。当工作线程执行结束,Service服务会自动停止。IntentService是一个抽象类,用户必须实现一个子类去继承它,且必须实现IntentService里面的抽象方法onHandleIntent来处理异步任务请求。 IntentServic示例

Event Loop事件循环,GET!

爷,独闯天下 提交于 2020-02-03 18:26:58
JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求。在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件之间又是怎么样的一个顺序呢,比如多个setTimeout事件又是怎么样一个执行顺序?这就涉及到事件循环:Event Loop。 JS的单线程 虽然现在的JS可以用来做多方面的开发,但是最初的JS是浏览器的专用语言,用来操作DOM。所以从诞生之初,JS就被设计成单线程语言,原因是不想让浏览器变得太复杂,因为多线程需要共享资源、且有可能修改彼此的运行结果,对于一种网页脚本语言来说,这就太复杂了。如果 JavaScript 同时有两个线程,一个线程在网页 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?是不是还要有锁机制?所以,为了避免复杂性,JavaScript 一开始就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 但是这种单线程机制却制造了另一个麻烦,假如一个操作需花费很长时间,那么此时浏览器就会一直等待这个操作完成,就会造成不好的体验。因此,JS的另一个事件就是异步事件。异步事件是专门将一些事件以队列的形式储存到浏览器的任务队列中,等同步事件执行完后再去执行,这样就避免了页面堵塞。 JavaScript 引擎怎么知道异步任务有没有结果

js中的同步异步运行机制及promise、异步函数

独自空忆成欢 提交于 2020-02-03 02:22:48
1.js先执行同步代码,异步代码放在异步队列中等待。 2.异步函数不阻塞后续代码执行,所以异步函数return拿不到返回结果,需要使用回调函数将代码放在异步代码中。 3.要想解决的话使用就异步按同步执行会出现回调地狱。使用Promise可以解决。 4.但是promise还不够简便,然后就有了async异步函数配合 await。注意await后面接收Promise对象并解析其结果。 5.异步函数默认的返回值是promise对象,await如果此步骤没有返回值,就暂停当前函数的执行。在异步函数中使用throw可以抛出异常。 来源: CSDN 作者: MambaCoding 链接: https://blog.csdn.net/Clearlove_8/article/details/104145016

JS(19)JS执行机制

你离开我真会死。 提交于 2020-02-02 06:41:54
1.JS执行机制 1.1.JS是单线程 -- JS语言的一大特点就是单线程,同一个时间只能做一件事。 -- 单线程意味着,所有任务需要排队,前一个任务结束,会执行后一个任务, 如果前一个任务耗时很长,后一个任务就不得不一直等着。 -- 这导致:如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。 1.2.同步任务和异步任务 -- 为了解决大拿县城带来的问题,利用多核CPU的计算能力,H5提出Web Worker标准, 允许JS脚本创建多个线程,但是子线程完全受主线程控制,于是JS出现了同步和异步任务。 1.2.1.同步 -- 前一个任务结束,结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的,同步的。 比如做饭的同步做法:烧水煮饭,等水开了(10分钟后),再去切菜,炒菜。 1.2.2.异步 -- 做一个花费时间的事情,在等待的同时,可以处理其他事情,比如做饭的异步做法:在烧水的同时,去切菜,炒菜。 本质区别:流水线上各个流程的执行顺序不同 1.3.JS中所有的任务可以分成两种,一种是同步任务,一种是异步任务。 1.3.1.同步任务指的是: 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务 1.3.2.异步任务指的是: 不进入主线程,而进入“任务队列”的任务,当主线程中的任务运行完了,才会去从“任务队列