202205-30 一篇文章理解阻塞、非阻塞、同步、异步 目录理解阻塞、非阻塞、同步、异步阻塞非阻塞同步异步总结理解阻塞、非阻塞、同步、异步首先说明,这些都是在特点场景下或者相对情况的词汇,OK,接下来开门见山。阻塞可以很直观的理解,就如节假日高速路出口收费站一样,上图片:9个收费亭,同时来了一大波车,这时候同一时刻只能有9辆车在收费,剩下的车都在只能在后面排队等待,这就是现实中很直观的阻塞现象。这9个收费亭,就是一个瓶颈,或许画为这样更符合大家对瓶颈二字的... 继续阅读 >
202108-31 深入理解.NET中的异步 目录一、前言二、初看异步三、多线程编程四、异步编程五、Task(ValueTask)六、Task.Run七、自己封装异步逻辑八、同步方式调用异步代码九、voidasync是什么?十、await必须配合Task/ValueTask才能用吗?十一、结语一、前言网上有很多关于.NETasync/await的介绍,但是很遗憾,很少有正确的,甚至说大多都是“从现象编原理”都不过分。最典型的比如通过前后线程ID来推断其工作方式、在async方法中用Thread.Sleep... 继续阅读 >
202108-31 解析Java异步之call future 目录一、概述二、Callable、Executor与Future2.1、任务:Callable2.2、执行:ExecutorService2.3、结果:Future三、使用举例3.1、使用Future3.2、使用FutureTask四、总结一、概述我们大家都知道,在Java中创建线程主要有三种方式:继承Thread类;实现Runnable接口;实现Callable接口。而后两者的区别在于Callable接口中的call()方法可以异步地返回一个计算结果Future,并且一般需要配合ExecutorService... 继续阅读 >
202108-08 浅谈JS三座大山之异步和单线程 目录单线程异步单线程但是我们在开发中,遇到请求网络,或者定时任务的时候,如果等待网络请求结束或者定时任务结束的时候再去做其他事情,这样页面就会卡住,所以js有异步机制解决这个问题。异步异步的特点是不会阻塞后面的代码执行,当同步任务执行完毕之后,再执行异步任务。相对的,同步会阻止代码执行。异步任务的应用主要有网络请求和定时任务。异步是通过callback的方式实现的,在callback里面执行异步执行的代码,但是有一... 继续阅读 >
202107-22 如何用RabbitMQ和Swoole实现一个异步任务系统 目录系统介绍事件生产者任务调度器消费者正常任务延迟任务自定义调度器系统介绍从图中可以看到,我们这个系统是一个基于事件的异步任务系统。就是说当一个事件产生时,生产者将事件抛给调度器,调度器负责查询事件下有哪些任务,然后将这些任务丢到相应的队列中,最后由消费者消费任务队列中的任务。在整个系统中主要分为三大部分1.事件生产者,即产生消息事件的一方。2.任务调度器(Scheduler),负责注册事件并调度任务。3.消费者(... 继续阅读 >
202107-02 SpringBoot异步处理的四种实现方式 本篇文章我们以SpringBoot中异步的使用(包括:异步调用和异步方法两个维度)来进行讲解。异步请求与同步请求我们先通过一张图来区分一下异步请求和同步请求的区别:在上图中有三个角色:客户端、Web容器和业务处理线程。两个流程中客户端对Web容器的请求,都是同步的。因为它们在请求客户端时都处于阻塞等待状态,并没有进行异步处理。在Web容器部分,第一个流程采用同步请求,第二个流程采用异步回调的形式。通过异步处理,可以... 继续阅读 >
202107-01 Flask实现异步执行任务 Flask是Python中有名的轻量级同步web框架,在一些开发中,可能会遇到需要长时间处理的任务,此时就需要使用异步的方式来实现,让长时间任务在后台运行,先将本次请求的响应状态返回给前端,不让前端界面「卡顿」,当异步任务处理好后,如果需要返回状态,再将状态返回。怎么实现呢?使用线程的方式当要执行耗时任务时,直接开启一个新的线程来执行任务,这种方式最为简单快速。通过ThreadPoolExecutor来实现fromflaskimpo... 继续阅读 >
202106-19 详解nodejs中的异步迭代器 前言从Node.jsv10.0.0开始,异步迭代器就出现中了,最近它们在社区中的吸引力越来越大。在本文中,我们将讨论异步迭代器的作用,还将解决它们可能用于什么目的的问题。什么是异步迭代器那么什么是异步迭代器?它们实际上是以前可用的迭代器的异步版本。当我们不知道迭代的值和最终状态时,可以使用异步迭代器,最终我们得到可以解决{value:any,done:boolean}对象的promise。我们还获得了for-await-of循环,以帮助我们循环异... 继续阅读 >
202106-13 JS异步代码单元测试之神奇的Promise 前言写这篇文章的起因是在写单元测试时,做形如下测试时newPromise((resolve,reject)=>reject(1)).then().catch(err=>{console.log(err)})asyncfunctionjestTest(){awaitPromise.resolve().then()console.log('这个时候catch预期已经被调用,且输出日志')}jestTest()无法使用await将测试代码恰好阻塞到catch在EventLoop中被调用后的时机,从而检测到catch的执行,通过测试。而使用“神奇”一词则是因为pr... 继续阅读 >
202106-13 JS 9个Promise面试题 1.多个.catchvarp=newPromise((resolve,reject)=>{reject(Error('TheFails!'))})p.catch(error=>console.log(error.message))p.catch(error=>console.log(error.message))以上代码的输出将会是什么?请选择正确的答案:[]打印一次消息[x]打印两次消息[]UnhandledPromiseRejectionWarning[]程序退出解析:我们使用构造函数方法创建一个Promise,并通过reject回调立即触发错误。然后.catch工... 继续阅读 >
202106-04 JS ES6异步解决方案 最初使用回调函数由于最初js官方没有明确的规范,各种第三方库中封装的异步函数中传的回调函数中的参数没有明确的规范,没有明确各个参数的意义,不便于使用。但是node中有明确的规范node中的的回调模式:1.所有回调函数必须有两个参数,第一个参数表示错误,第二个参数表示结果2.所有回调函数必须作为函数最后的参数3.所有回调函数不能作为属性出现es6异步处理模型Es6出现以后,官方就提出了异... 继续阅读 >
202106-03 JS如何为promise增加abort功能 概述Promise只有三种状态:pending、resolve、reject,一个异步的承诺一旦发出,经历等待(pending)后,最终只能为成功或者失败,中途无法取消(abort)。为promise提供abort功能的思路有两种:手动实现abort,触发取消后,异步回来的数据直接丢弃(手动实现,比较稳妥)使用原生方法AbortController中断请求(实验中的方法,有兼容性,ie不支持)手动实现abort方法有两种模式:都是依赖promise的接口间接实现promiserace... 继续阅读 >
202106-03 JS异步堆栈追踪之为什么await胜过Promise 概述async/await和Promise的根本区别在于awaitfn()暂停当前函数的执行,而promise.then(fn)在将fn调用添加到回调链后,继续执行当前函数。constfn=()=>console.log('hello')consta=async()=>{awaitfn()//暂停fn的执行}//调用a时,才恢复fn的执行a()//"hello"constpromise=Promise.resolve()//将fn添加到回调链后,继续执行fnpromise.then(fn)//"hello"在堆栈追踪的上下文中,这种差异非常显著... 继续阅读 >
202105-26 C#异步的世界(下) 前言今天说异步的主要是指C#5的async\await异步。在此为了方便的表述,我们称async\await之前的异步为“旧异步”,async\await为“新异步”。新异步的使用只能说新异步的使用太简单(如果仅仅只是说使用)方法加上async修饰符,然后使用await关键字执行异步方法,即可。对就是如此简单。像使用同步方法逻辑一样使用异步。publicasyncTask<int>Test(){varnum1=awaitGetNumber(1);varnum2=awaitGetNumber(num1... 继续阅读 >
202105-26 C#异步的世界(上) 前言新进阶的程序员可能对async、await用得比较多,却对之前的异步了解甚少。本人就是此类,因此打算回顾学习下异步的进化史。本文主要是回顾async异步模式之前的异步,下篇文章再来重点分析async异步模式。APMAPM异步编程模型,AsynchronousProgrammingModel早在C#1的时候就有了APM。虽然不是很熟悉,但是多少还是见过的。就是那些类是BeginXXX和EndXXX的方法,且BeginXXX返回值是IAsyncResult接口。在正式写APM示例之前我们先... 继续阅读 >
202105-25 详解JavaScript Promise和Async/Await 概述一般在开发中,查询网络API操作时往往是比较耗时的,这意味着可能需要一段时间的等待才能获得响应。因此,为了避免程序在请求时无响应的情况,异步编程就成为了开发人员的一项基本技能。在JavaScript中处理异步操作时,通常我们经常会听到"Promise"这个概念。但要理解它的工作原理及使用方法可能会比较抽象和难以理解。四个示例那么,在本文中我们将会通过实践的方式让你能更快速的理解它们的概念和用法,所以与许多传统干巴... 继续阅读 >