异步

同步异步、阻塞非阻塞

天大地大妈咪最大 提交于 2021-02-02 04:51:23
同步与异步:一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能完成,这是一种可靠的任务序列。 阻塞与非阻塞:主要是从CPU的消耗上来说的,阻塞就是CPU停下来等待一个慢的操作完成以后,CPU才接着完成其他事情。 同步阻塞:最常用的一种用法,使用也是最简单的,但是I/O性能一般很差,CPU大部分处于空闲状态。 同步非阻塞:提升I/O性能的常用手段,就是将I/O的阻塞改为非阻塞方式,尤其在网络I/O是长连接同时传输数据也不是很多的情况下,提升性能非常有效。这种方式通常能提升I/O性能,但是会增加CPU消耗,要考虑增加的I/O性能能不能补偿CPU的消耗,也就是系统的瓶颈是在I/O还是在CPU上。 异步阻塞:这种方式在分布式数据库中经常用到,例如,在一个分布式数据库中写一条记录,通常会有一份是同步组撒的记录,而还有两至三份备份记录会写在其他机器上,这些备份记录通常都采用异步阻塞的方式写I/O。异步阻塞对网络I/O能够提升效率,尤其像上面这种同时写多份相同数据的情况。 异步非阻塞:这种组合方式用起来比较复杂,只有在一些非常复杂的分布式情况下使用,集群之间的消息同步机制一般用这种I/O组合方式。如Cassandra的Gossip通信机制就是采用异步非阻塞的方式,他适合同时要传多份数据到集群中不同机器,同事数据的传输量虽然不大但是却非常频繁。这种网络I

Java I/O 模型的演进

混江龙づ霸主 提交于 2020-11-27 04:54:55
原文同步至 http://waylau.com/java-io-model-evolution/ 什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型。而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 Java I/O 模型来提高系统的并发量和可用性。 由于,Java 的 I/O 依赖于操作系统的实现,所以先了解 Unix 的 I/O 模型有助于理解 Java 的 I/O。 相关概念 同步和异步 描述的是用户线程与内核的交互方式: 同步 是指用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行; 异步 是指用户线程发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。 阻塞和非阻塞 描述的是用户线程调用内核 I/O 操作的方式: 阻塞 是指 I/O 操作需要彻底完成后才返回到用户空间; 非阻塞 是指 I/O 操作被调用后立即返回给用户一个状态值,无需等到 I/O 操作彻底完成。 一个 I/O 操作其实分成了两个步骤:发起 I/O 请求和实际的 I/O 操作。 阻塞 I/O 和非阻塞 I/O 的区别在于第一步,发起 I/O 请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞 I/O ,如果不阻塞

nodejs 异步编程 vs promise用法

六月ゝ 毕业季﹏ 提交于 2020-04-07 05:57:42
零、关于异步 如图,是一个传统nodejs项目中比较容易看到的一种编程风格,其原因是因为nodejs底层的很多异步方法都是通过配合回调方法来实现的。理解异步我们必须掌握以下几个知识点: 1、单线程 JavaScript的引擎是单线程的,即无论是在浏览器环境还是基于JavaScript引擎的nodejs服务器环境有且仅有一段代码正被执行,JavaScript引擎不会同时执行a函数的代码和b函数的代码。 2、JavaScript轮询机制(主线程 VS Event Loop线程) 轮询(event loop)简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。 就是说执行我们程序员写的代码的是主线程,当主线程遇到io操作的时候, 主线程就 通知 Event Loop线程去执行相应的I/O程序,自己则继续执行其他代码,当Event Loop线程把io任务完成后会主动告诉主线程我已经执行完了,主线程收到通知后会调用事先准备好的回调函数,完成整个任务。 基于以上原因早期的nodejs 代码会存在大量的callback函数嵌套,这些callback正是为主线程在收到Event Loop线程完成io操作后准备的回调函数。 3、如何与Event

谈谈angularjs中的异步问题(一)

对着背影说爱祢 提交于 2020-04-06 21:46:38
因为上次遇到的那个问题,所以这里我就把angularjs的异步问题刨根问底的查一查 再说angularjs的异步之前,我们先说说关于JavaScript中的异步的问题吧。 我们都知道JavaScript是一个单线程的玩意儿,所谓的单线程,就是你要执行这个代码,就必须等前面的全都搞定了才能轮到你(有一种厕所里就一个坑的感觉有木有),这种模式下,实现起来非常的简单。秩序好!但是当然,显而易见到问题是,这里执行效率很低。所以JavaScript就出现了另一个模式,异步模式! 所谓的异步模式就是每一个任务有一个或者多个回调函数,前一个任务执行完成以后不是执行后一个任务,而是执行回调函数,而后一个任务也不需要等待前一个任务执行完就去执行。 关于异步和同步这里我想大家可能都非常的清楚明白的,我这里也不赘述了,下面简单说下异步模式下编程的四种方法吧: 一、 回调函数 这个是实现异步的最简单的方法 假设有两个函数 f1(); f2(); f1执行完了以后再去执行f2,这里我们就可以用毁掉函数去解决 具体的使用如下: function f1(callback){     setTimeout(function () {       // f1的任务代码       callback();     }, 1000);   } 所以我们的代码就可以变成:  f1(f2);

gulp中如何保证任务执行顺序。

六月ゝ 毕业季﹏ 提交于 2020-03-16 15:16:25
某厂面试归来,发现自己落伍了!>>> 举一个简单了例子: gulp.task('task2',function(){ setTimeout(function(){ console.log("task2 has been completed") },3000) }) gulp.task('task1',['task2'],function(){ console.log("task1 has been completed") }) 在命令行中执行gulp task1 通过命令行的任务流程,我们可以看出,任务并没有像我们想象的那样运行。这是因为在gulp中,所有task都是异步执行的,那么此时我们需要引入q模块来帮助我们解决这个问题。 通过命令行输入gulp install q --save-dev来安装q模块 var Q = require('q'); var Q = require('q'); gulp.task('task2',function(){ var deferred = Q.defer(); setTimeout(function(){ console.log("task2 has been completed") deferred.resolve(); },3000) return deferred.promise; }) gulp.task('task1',[

深入理解async和await

拜拜、爱过 提交于 2020-02-21 23:38:19
async叫异步函数。是ES2017新出的,这让异步操作变得更简单了。本质上是Generator的语法糖,所以本质上还是操作promise对象观察状态。 将promise方法中得generator和yield替换成async和await结合使用,也就是一个语法糖 1. async/await是什么? async/await其实是Promise的语法糖,它能实现的效果都能用then链来实现,这也和我们之前提到的一样,它是为优化then链而开发出来的。从字面上来看,async是“异步”的简写,await译为等待,所以我们很好理解async声明function是异步的,await等待某个操作完成。当然语法上强制规定await只能出现在asnyc函数中,我们先来看看async函数返回了什么: async function testAsy ( ) { return 'hello world' ; } let result = testAsy ( ) ; console . log ( result ) 这个async声明的异步函数把return后面直接量通过Promise.resolve()返回Promise对象,所以如果这个最外层没有用await调用的话,是可以用原来then链的方式来调用的: async function testAsy ( ) { return 'hello world

SynchronizationContext(同步上下文)综述

寵の児 提交于 2020-02-01 11:05:35
>>返回《C# 并发编程》 1. 概述 2. 同步上下文 的必要性 2.1. ISynchronizeInvoke 的诞生 2.2. SynchronizationContext 的诞生 3. 同步上下文 的概念 4. 同步上下文 的实现 4.1. WinForm 同步上下文 4.2. Dispatcher 同步上下文 4.3. Default 同步上下文 4.4. 上下文捕获和执行 4.5. AspNetSynchronizationContext 5. 同步上下实现类 的注意事项 6. AsyncOperationManager 和 AsyncOperation 7. 同步上下文 的Library支持示例 7.1. WCF 7.2. Workflow Foundation (WF) 7.3. Task Parallel Library (TPL) 7.4. Reactive Extensions (Rx) 7.5. 异步编程 Async 8. 限制和功能 1. 概述 无论是什么平台(ASP.NET 、WinForm 、WPF 等),所有 .NET 程序都包含 同步上下文 概念,并且所有多线程编程人员都可以通过理解和应用它获益。 2. 同步上下文 的必要性 2.1. ISynchronizeInvoke 的诞生 原始多线程 多线程程序在 .NET Framework

SpringMVC的孪生兄弟WebFlux

笑着哭i 提交于 2020-01-08 20:58:38
一、入门文字介绍 官方口水话简短翻译:   Spring WebFlux是一个非阻塞的Web框架,用于利用多核,短时间可一处理大量并发连接。 非阻塞式   在servlet3.1提供了非阻塞的API,WebFlux为之有自己的一套手段,   使用非阻塞的方式可以利用 较小的线程或硬件资源 来 处理并发 函数式编程端点   Spring5必须配备java8,函数式编程就是java8重要的特点之一,   WebFlux支持函数式编程来定义路由端点处理请求。 二、入门小Demo Test   创建一个Spring Boot项目,版本要求2.0以上,需要下面的依赖,Spring Reactive Web 替代了Web依赖        看看我们的处理器:Controller     抽一个方法出来,待会儿会使用到,这个方法假如就是我们一个比较耗时的逻辑操作            然后看我们的处理器 @Slf4j @RestController              我们定义了两个处理器,一个就是普通的处理器,一个是使用了WebFlux的处理器,       然后我们观察我们的控制台日志情况:        ... 有没有发现什么一样,当然我们的页面都是一样的,需要在五秒后才会有结果,但是你观察控制台 发现下面那个打印的时间间隔很短有没有,并没有像上面那个一样等待五秒才打印

SpringMVC的孪生兄弟WebFlux

半腔热情 提交于 2020-01-04 05:18:18
一、入门文字介绍 官方口水话简短翻译:   Spring WebFlux是一个非阻塞的Web框架,用于利用多核,短时间可一处理大量并发连接。 非阻塞式   在servlet3.1提供了非阻塞的API,WebFlux为之有自己的一套手段,   使用非阻塞的方式可以利用 较小的线程或硬件资源 来 处理并发 函数式编程端点   Spring5必须配备java8,函数式编程就是java8重要的特点之一,   WebFlux支持函数式编程来定义路由端点处理请求。 二、入门小Demo Test   创建一个Spring Boot项目,版本要求2.0以上,需要下面的依赖,Spring Reactive Web 替代了Web依赖        看看我们的处理器:Controller     抽一个方法出来,待会儿会使用到,这个方法假如就是我们一个比较耗时的逻辑操作            然后看我们的处理器 @Slf4j @RestController              我们定义了两个处理器,一个就是普通的处理器,一个是使用了WebFlux的处理器,       然后我们观察我们的控制台日志情况:        ... 有没有发现什么一样,当然我们的页面都是一样的,需要在五秒后才会有结果,但是你观察控制台 发现下面那个打印的时间间隔很短有没有,并没有像上面那个一样等待五秒才打印

异步复位同步释放

℡╲_俬逩灬. 提交于 2019-12-30 00:52:25
转载:https://blog.csdn.net/dongdongnihao_/article/details/79827076 在学习特权同学深入浅出玩转FPGA时,课本里面讲到,同步复位和异步复位都有其弊端。 异步复位的弊端: 异步复位中最严重的问题是,如果异步复位信号在触发器时钟有效沿 附近 “释放”(复位信号从有效变为无 效)的话,可能会导致触发器输出的亚稳态 。 这里不得不说的是触发器有两个特点: 1. 异步复位信号释放(对低电平有效的复位来说就是上跳沿)与紧跟其后的第一个时钟有效沿之间,有一个必须间隔的最小时间称为Trecovery(recovery time,恢复时间)。 举例 :如果异步复位释放后马上来了一个时钟有效边沿,触发器输出端的值将是不确定的,可能是高电平也可能是低电平,可能处于高低电平之间,也可能处于震荡状态,这就是亚稳态。如下图所示,Q为输出。 2. 时钟有效沿与紧跟其后的异步复位信号释放之间所必须的最小时间称为tremoval(removal time消除时间)。小于这个时间,则触发器的输出端的值将是不确定的,可能是高电平,可能是低电平,可能处于高低电平之间,也可能处于震荡状态,并且在未知的时刻会固定到高电平或低电平。这种状态就称为亚稳态。 举例:如果时钟有效沿到来后,马上来了异步复位信号的上升沿(复位信号释放)触发器处于亚稳态。如下图所示。