异步编程同步和异步概念| 8月更文挑战

695 阅读4分钟

在现在的软件开发中,服务器都是多核,所以我们开发者在更多开发的时候需要考虑如何提高运行速度的效率,设计出性能更加优异的系统。提高运行效率吗,除了优化代码的执行流程,还有最重要的就是充分利用服务器处理器多核的优势,让代码能够并行运行起来提高执行效率。
比如说:统计博文的点赞数,文章的阅读量,文章的转发量等等,在全部都统计完成后,再生成统计数据报表。按照串行的思想执行:文章点赞数->文章阅读量->文章转发量->统计报表,这样一次只能够运行一个功能,如果将不同关联的功能并行执行完成后,最后在执行需要关联的功能,这样岂不是就会提高代码的运行效率,充分的利用服务器的性能资源,可以将刚刚串行执行的流程中:文章点赞数、文章阅读量、文章转发量 这三个功能并行执行完成后,在执行生成统计报表,这样就会提高代码的执行效率,至于怎么实现,请接着看下面相关的文章内容。

未命名文件.png
从流程图可以看出将文章点赞数、文章阅读量、文章转发量没有任何联系的方法并行执行各自完成各自的功能,然后等全部执行完成后在执行共同的功能方法。
在开放中对于松耦合服务,我们应该尽量让他们并行化执行,避免阻塞出现,从而最大化程序的吞吐量,提高功能的执行效率,最大化利用服务器的资源,提高服务器CPU的执行率。

同步API

同步API就是传统的方法调用,以串行的形式实现。比方当调用多个方法时,第一个方法执行时,其他方法会产生等待,当第一个方法执行完之后,取得返回结果后,后续的方法在继续逐一执行。对于这种调用方式,业界内一般称之为阻塞式调用
上面流程图中左边部分都为同步API,四个功能依次执行,等上一个功能执行完成后在执行下一个功能,如果每个功能执行都需要2秒钟,那整个流程执行完成后就需要8秒钟,在线上服务如果出现这样的情况,那肯定是不能够接受的,而且服务器都是多核服务器,这样执行也极大的浪费资源,浪费服务器多核的资源优势。

异步API

异步API是将不关联的功能以并行的方式完成对方法的执行,每个方法的执行都用另外的线程去执行,这种方式称为**非阻塞式调用,**每一个任务线程都会将自己的结果返回给调用方,要么通过回调,要么通过调用方再次执行一个“等待->结束”方法。
上面流程图中右边边部分都为异步步API+同步API的混合调用,文章点赞数、文章阅读量、文章转发量这三个功能的调用称为异步API,他们的功能调用都用的是不同的线程执行,互不干扰,待三个都执行完成后,将结果返回给调用方,在执行统计报表,这样的话极大的节约时间,按照这样的执行流程大致需要4秒钟就可以执行完成,极大的加快了执行的速度,完美的利用了多核服务器的资源优势。

案例

上面举的案例,根据文章的阅读量,转发量,评论量最后生成报表的同步和异步执行流程,在下面我用代码来具体的编码实现。

  • 同步执行代码
report(getLikeCount(), getWatchCount(), getForwardCount());
  • 异步执行代码
futureA = executor.submit((Callable) () -> getLikeCount());
futureB = executor.submit((Callable) () -> getWatchCount());
futureC = executor.submit((Callable) () -> getForwardCount());
report(futureA, futureB, futureC);

可以看出异步执行主要采用线程池结合Future 来实现具体的操作逻辑,这样的话不用我们去考虑线程的相关状态,只需要关心具体执行结果,至于Future怎么用以及原理,请关注博主的其他文章。