异步队列

promise的前世来生

匿名 (未验证) 提交于 2019-12-03 00:08:02
问题 什么是单线程,和异步什么关系 什么是event-loop 是否用过jquery中的deferred Promise的基本使用和原理 介绍async/await(和Promise的联系和区别)――不是取代,而是补充 介绍一下异步解决方案 单线程和异步 单线程,同一时间只能做一件事,可以避免DOM渲染冲突。 浏览器需要渲染DOM,JS可以修改DOM结构,所以JS执行的时候,浏览器DOM渲染会暂停,且两端JS也不能同时执行。 虽然webworker支持多线程,但是不能访问DOM。 解决方案是异步。但异步存在问题。 不按照书写方式执行,可读性差 回调函数不容易模块化。 事件循环 同步代码,直接执行。异步函数完成先放在异步队列中。待同步函数执行完毕,轮询执行异步队列的函数。 jQuery的Deferred jquery1.5的变化 var ajax = $ . ajax ( { url : 'data.json' , success : function ( ) { console . log ( 'success1' ) ; console . log ( 'success2' ) ; } , error : function ( ) { console . log ( 'error' ) ; } } ) var ajax = $ . ajax ( 'data.json' ) ;

JS异步编程

匿名 (未验证) 提交于 2019-12-02 23:55:01
1.1 什么是异步 异步(async) 是相对于 同步(sync) 而言的,很好理解。 同步 就是一件事一件事的执行。只有前一个任务执行完毕,才能执行后一个任务。而 异步是不用等待前一个任务执行完成也能够执行 比如: setTimeout(function(){ console.log(1); }, 1000); console.log(2);// 2 1 setTimeout就是一个 异步任务 1.2 为啥要在JS中使用异步 由于javascript是 单线程 的,只能在JS引擎的主线程上运行的,所以js代码只能一行一行的执行,不能在同一时间执行多个js代码任务,这就导致如果有一段耗时较长的计算,或者是一个ajax请求等IO操作,如果没有异步的存在,就会出现用户长时间等待,并且由于当前任务还未完成,所以这时候所有的其他操作都会无响应。 1.3 那为啥JS不设计成多线程的 这主要跟javascript的历史有关,js最开始只是为了处理一些表单验证和DOM操作而被创造出来的,所以主要为了语言的轻量和简单采用了 单线程 的模式。 多线程模型 相比 单线程 要复杂很多,比如多线程需要处理线程间资源的共享问题,还要解决状态同步等问题。 如果JS是多线程的话,当你要执行往div中插入一个DOM的操作的同时,另一个线程执行了删除这个div的操作,这个时候就会出现很多问题

ios多线程同步异步任务、串行并行队列、死锁

匿名 (未验证) 提交于 2019-12-02 23:43:01
队列 概念:队列只负责任务的调度,而不负责任务的执行,任务是在线程中执行的。(可以理解成任务是放在队列里面的,要被调度到线程中去执行) 特点:队列先进先出,排在前面的任务最先执行。 分类:队列分为串行、并行、主队列、全局队列。 串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会调度。 并行队列:只要有空闲的线程,队列就会调度当前任务,交给线程去执行,不需要考虑前面是都有任务在执行,只要有线程可以利用,队列就会调度任务。 主队列:只负责把任务调度到主线程去执行。所以主队列的任务都要在主线程来执行,主队列会随着程序的启动一起创建,我们只需get即可。 全局队列:是系统为了方便程序员开发提供的,其工作表现与并发队列一致。 任务的执行是在线程上去执行的。分为同步和异步。 同步:不会开启新的线程,任务按顺序执行。 异步:会开启新的线程,任务可以并发的执行。 所以就可以分成:串行队列同步执行、串行队列异步执行、并行队列同步执行、并行队列异步执行。 串行队列同步执行:按顺序执行并不会开启新的线程,则串行队列同步执行只是按部就班的 one by one 执行。 串行队列异步执行:虽然队列中存放的是异步执行的任务,但是结合串行队列的特点,前一个任务不执行完毕,队列不会调度,所以串行队列异步执行也是 one by one 的执行 并行队列同步执行:结合上面阐述的并行队列的特点

node文件操作同步或异步调用

匿名 (未验证) 提交于 2019-12-02 23:38:02
同步或异步调用 fs模块对文件的几乎所有操作都有同步和异步两种形式 例如:readFile() 和 readFileSync() 区别: 同步调用会阻塞代码的执行,异步则不会 异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调 异常处理方面,同步必须使用 try catch 方式,异步可以通过回调函数的第一个参数 console . time ( 'sync' ) ; try { var data = fs . readFileSync ( path . join ( 'C:\\Users\\iceStone\\Downloads' , 'H.mp4' ) ) ; // console.log(data); } catch ( error ) { throw error ; } console . timeEnd ( 'sync' ) ; console . time ( 'async' ) ; fs . readFile ( path . join ( 'C:\\Users\\iceStone\\Downloads' , 'H.mp4' ) , ( error , data ) => { if ( error ) throw error ; // console.log(data); } ) ; console . timeEnd ( 'async' ) ; 文章来源:

Django(异步)--Celery

匿名 (未验证) 提交于 2019-12-02 23:34:01
下面以发送认证电子邮件为例: 我们在做网站后端程序开发时,会碰到这样的需求:用户需要在我们的网站填写注册信息,我们发给用户一封注册激活邮件到用户邮箱,如果由于各种原因,这封邮件发送所需时间较长,那么客户端将会等待很久,造成不好的用户体验。 关于Celery: Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。 任务发出者 -----> 任务队列----->任务处理者 1、建立消息队列 首先,我们必须拥有一个broker消息队列用于发送和接受消息。Celery官网给出了多个broker的备选方案:RabbitMQ、Redis、Database(不推荐)以及其他的消息中间件。使用RabbitMQ作为我们的消息中间人。在Linux上安装的方式如下: sudo apt-get install rabbitmq-server 命令执行成功后,rabbitmq-server就已经安装好并运行在后台了。 另外也可以通过命令rabbitmq-server -detached来在后台启动rabbitmq server以及命令rabbitmqctl stop来停止server。 在settings.py import djcelery djcelery.setup_loader() BROKER_URL = 'redis:/

nginx IO模型

折月煮酒 提交于 2019-12-02 23:27:42
今天下班早些来普及下nginx io模型: 用户空间与内核空间: 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。 进程切换: 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。 从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化: 保存处理机上下文,包括程序计数器和其他寄存器。 更新PCB信息。 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。 选择另一个进程执行,并更新其PCB。 更新内存管理的数据结构。 恢复处理机上下文。 注:总而言之就是很耗资源,具体的可以参考这篇文章: http:/

python 并发编程之异步IO

匿名 (未验证) 提交于 2019-12-02 22:51:30
关于异步的一些基本了解请 参考这篇文章 , 或者 内核态和用户态 由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,操作系统划分出两个权限等级:用户态和内核态。 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。 用户态:当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。 五种 IO 模型中, IO 复用的技术较为成熟,因此使用也比较广泛。而最为理想的是异步 IO,整个过程没有阻塞,而且有通知。 IO 多路复用模型有三种:select poll epoll,它们的性能是层层递增。 2.1 select sokect 是通过一个 select() 系统调用来监视多个文件描述符,当 select() 返回后,该数组中就绪的文件描述符便会被该内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select 的优点是支持跨平台,缺点在于单个进程能够监视的文件描述符的数量存在最大限制。 另外 select() 所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量 TCP 连接处于非活跃状态,但调用 select() 会对所有 socket 进行一次线性扫描,所以这也浪费了一定的开销。 文件描述符 fd

javascript的执行机制―Event Loop

匿名 (未验证) 提交于 2019-12-02 21:53:52
既然今天要谈的是javascript的事件循环机制,要理解事件循环,首先要知道事件循环是什么。 我们先从一个例子来看一下javascript的执行顺序。 <script> setTimeout(function() { console.log('定时器开始了.'); },0) new Promise(function(resolve) { console.log('马上执行for循环了'); for (let i = 0; i < 10000; i++) { i == 99 && resolve(); } }).then(function() { console.log('执行then函数了'); }) console.log('代码执行结束'); //执行结果为: //马上执行for循环了 //代码执行结束 //执行then函数了 //定时器开始了. </script> 怎么样,是不是和自己在心里运行的结果差了一万八千里呢。如果是的话,请耐心看完后面的内容,让你彻底弄明白javascript的事件循环机制。 单线程的javascript 要想了解事件循环的我们就得从javascript的工作原理开始说起。 javascript语言的一大特点就是单线程,可是为什么javascript不做成多线程呢? JavaScript的单线程,与它的用途有关。作为浏览器脚本语言

JS运行机制

匿名 (未验证) 提交于 2019-12-02 21:53:52
前言 前端小白学习总结,欢迎讨论和指导。 本文从JS是单线程开始,到JS为了提高效率,使用异步,到JS如何实现异步,再到浏览器是如何配合JS执行异步。最后提到了一个任务队列的优先级问题。 本文是学习JS运行机制中捋出来的思路,有点层层递进的感觉,难免有理解错误或表述不当的地方。如果能帮助到看到这篇的你,我很感激。 一、JS是单线程。 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。不妨叫它 主线程 。 选择单线程的原因之一是JS要操作DOM,如果多线程可能造成执行混乱。经典栗子来了,有要删除节点的函数,有要操作节点的。万一多线程执行顺序乱了就坏了。 二、JS的异步 单线程使得JS引擎只能一个任务结束再执行下一个,如果某任务时间较长,就会发生阻塞。为了解决这个问题。JS也使用了异步编程。 简单说下同步(synchronous)和异步(asynchronous)。 同步和异步通常是用来形容一个函数被调用时发生的行为。 同步函数被调用时,调用必须获得预期结果后,才能继续后续行为。比如,下面这个(毫无营养的)函数, var synFunc = function(description){ var str = "you are"; str = str + description; consoloe.log(str); } synFunc("great");

SpringBoot异步编程

南楼画角 提交于 2019-12-02 16:02:13
异步调用: 当我们执行一个方法时,假如这个方法中有多个耗时的任务需要同时去做,而且又不着急等待这个结果时可以让客户端立即返回然后,后台慢慢去计算任务。当然你也可以选择等这些任务都执行完了,再返回给客户端。 SpringBoot 异步编程实战 如果我们需要在 SpringBoot 实现异步编程的话,通过 Spring 提供的两个注解会让这件事情变的非常简单。 @EnableAsync :通过在配置类或者Main类上加@EnableAsync开启对异步方法的支持。 @Async 可以作用在类上或者方法上,作用在类上代表这个类的所有方法都是异步方法。 1. 自定义 TaskExecutor 很多人对于 TaskExecutor 不是太了解,所以我们花一点篇幅先介绍一下这个东西。从名字就能看出它是任务的执行者,它领导执行着线程来处理任务,就像司令官一样,而我们的线程就好比一只只军队一样,这些军队可以异步对敌人进行打击👊。 Spring 提供了 TaskExecutor 接口作为任务执行者的抽象,它和 java.util.concurrent 包下的 Executor 接口很像。稍微不同的 TaskExecutor 接口用到了 Java 8 的语法 @FunctionalInterface 声明这个接口是一个函数式接口。 如果没有自定义Executor, Spring 将创建一个