返回顶部
首页 > 资讯 > 精选 >java协程框架quasar和kotlin中的协程实例分析
  • 744
分享到

java协程框架quasar和kotlin中的协程实例分析

2023-06-29 07:06:42 744人浏览 泡泡鱼
摘要

这篇文章主要介绍“java协程框架quasar和Kotlin中的协程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java协程框架quasar和kotlin中的协程实例分析”文章能帮助大家解

这篇文章主要介绍“java协程框架quasar和Kotlin中的协程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java协程框架quasar和kotlin中的协程实例分析”文章能帮助大家解决问题。

    前言

    早就听说Go语言开发的服务不用任何架构优化,就可以轻松实现百万级别的qps。这得益于Go语言级别的协程的处理效率。协程不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作。而且线程的资源有限,在java中大量的不加限制的创建线程非常容易将系统搞垮。接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能像Go语言那样使用协程的语义开发了。

    快速体验

    添加依赖

    <dependency>            <groupId>co.paralleluniverse</groupId>            <artifactId>quasar-core</artifactId>            <version>0.7.10</version></dependency>

    注意:目前quasar最高的版本是0.8.0,但是最高版本的只支持jdk11以上

    添加java agent

    quasar的实现原理是在java加载class前,通过jdk的instrument机制使用asm来修改目标class的字节码来实现的,他标记了协程代码的起始和结束的位置,以及方法需要暂停的位置,每个协程任务统一由FiberScheduler去调度,内部维护了一个或多个ForkJoinPool实例。所以,在运行应用前,需要配置好quasar-core的java agent地址,在vm参数上加上如下脚本即可:

    -javaagent:D:\.m2\repository\co\paralleluniverse\quasar-core\0.7.10\quasar-core-0.7.10.jar

    线程VS协程

    下面模拟调用某个远程的服务,假设远程服务处理耗时需要1S,这里使用执行阻塞1S来模拟,分别看多线程模型和协程模型调用这个服务10000次所需的耗时

    协程代码

    public static void main(String[] args) throws Exception{        CountDownLatch count  = new CountDownLatch(10000);        StopWatch stopWatch = new StopWatch();stopWatch.start();        IntStream.range(0,10000).forEach(i-> new Fiber() {            @Override            protected String run() throws SuspendExecution, InterruptedException {                Strand.sleep(1000 );                count.countDown();                return  "aa";            }        }.start());        count.await();stopWatch.stop();        System.out.println("结束了: " + stopWatch.prettyPrint());    }

    耗时情况:

    java协程框架quasar和kotlin中的协程实例分析

    多线程代码

    public static void main(String[] args) throws Exception{        CountDownLatch count  = new CountDownLatch(10000);        StopWatch stopWatch = new StopWatch();stopWatch.start();        ExecutorService executorService = Executors.newCachedThreadPool();        IntStream.range(0,10000).forEach(i-> executorService.submit(() -> {            try {                TimeUnit.SECONDS.sleep(1);            } catch (InterruptedException ex) { }            count.countDown();        }));        count.await();stopWatch.stop();        System.out.println("结束了: " + stopWatch.prettyPrint());    }

    耗时情况

    java协程框架quasar和kotlin中的协程实例分析

    协程完胜

    可以看到上面的结果,在对比访问一个耗时1s的服务10000次时,协程只需要2秒多,而多线程模型需要4秒多,时效相差了一倍。而且上面多线程编程时,并没有指定线程池的大小,在实际开发中是绝不允许的。一般我们会设置一个固定大小的线程池,因为线程资源是宝贵,线程多了费内存还会带来线程切换的开销。上面的场景在设置200个固定大小线程池时。结果也是可预见的达到了50多秒。这个结果足以证明协程编程ko线程编程了。而且在qps越大时,线程处理的效率和协程的差距就约明显,缩小差距的唯一方式就是增加线程数,而这带来的影响就是内存消耗激增。而反观协程,基于固定的几个线程调度,可以轻松实现百万级的协程处理,而且内存稳稳的。

    后记

    最后,博主以为Quasar只是一个框架层面的东西,所以就又去看了下同样是JVM语言的kotlin的协程。他的语言更简洁,可以直接和java混合使用。跑上面这种实例只需要1秒多。

    fun main() {    val count = CountDownLatch(10000)    val stopWatch = StopWatch()    stopWatch.start()    IntStream.range(0,10000).forEach {        GlobalScope.launch {            delay(1000L)            println(Thread.currentThread().name + "->"+ it)            count.countDown()        }    }    count.await()    stopWatch.stop()    println("结束了: " + stopWatch.prettyPrint())}

    当博主看到这个结果的时候,有种震惊的赶脚,kotlin的同步模型牛逼呀,瞬时感觉到发现了java里的骚操作了,可以使用kotlin的协程来代替java中的多线程操作。因为他们两个混合开发毫无压力。如果行的通,那就太爽了。所以就有下面这个kotlin协程实现的代码:

    @Serviceclass KotlinAsyncService(private val weatherService: GetWeatherService,private val demoApplication: DemoApplication){    val weatherUrl = "Http://localhost:8080/demo/mockWeatherapi?city="    fun getHuNanWeather(): JSONObject{        val result = jsONObject()        val count = CountDownLatch(demoApplication.weatherContext.size)        for (city in demoApplication.weatherContext){            val url = weatherUrl + city.key            GlobalScope.launch {                result[city.key.toString()] = weatherService.get(url)                count.countDown()            }        }        count.await()        return result    }}

    现实是,当我使用协程替换掉我java多线程写的一个多线程汇聚多个http接口的结果的接口时,通过ab压测他们两个的性能并没有很大的变化,最后了解到主要原因是这个时候,在协程里发起一个http的请求时,涉及到操作系统层面的Socket io操作,io操作是阻塞的,协程的并发也就变成了调度协程的几个线程的并发了。而且当我把同样的代码放到Quasar中的时候,Quasar直接抛io异常了,说明Quasar还并不能轻松支持这个场景。那为什么上面的测试结果差距这么大呢,是因为我错误的把协程实现里的阻塞等同于线程的阻塞。协程里的delay挂起函数,会立马释放线程到线程池,但是当真正的io阻塞的时候也就和真正的线程sleep一样了,并没有释放当前的线程。所以这些对比都没有太大的意义

    关于“java协程框架quasar和kotlin中的协程实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: java协程框架quasar和kotlin中的协程实例分析

    本文链接: https://lsjlt.com/news/323407.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • java协程框架quasar和kotlin中的协程实例分析
      这篇文章主要介绍“java协程框架quasar和kotlin中的协程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java协程框架quasar和kotlin中的协程实例分析”文章能帮助大家解...
      99+
      2023-06-29
    • java协程框架quasar和kotlin中的协程对比分析
      目录前言快速体验添加依赖添加java agent线程VS协程协程代码多线程代码协程完胜后记前言 早就听说Go语言开发的服务不用任何架构优化,就可以轻松实现百万级别的qps。这得益于G...
      99+
      2024-04-02
    • java基于quasar实现协程池的方法示例
      业务场景:golang与swoole都拥抱了协程,在同任务并发数量下,协程可比线程多几倍。所以最近在查询java时了解java本身是没有协程的,但是某牛自行实现了协程,也就是本文的主...
      99+
      2024-04-02
    • Python的进程,线程和协程实例分析
      这篇“Python的进程,线程和协程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python的进程,线程和协程实例...
      99+
      2023-06-29
    • Kotlin中协程的创建过程详析
      目录为什么需要协程?创建并启动协程协程的执行过程suspend block 是如何变为协程体被执行的?总结总结为什么需要协程? 协程可以简化异步编程,可以顺序地表达程序,协程也提供了...
      99+
      2024-04-02
    • go语言中的协程实例分析
      这篇文章主要讲解了“go语言中的协程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言中的协程实例分析”吧!协程的特点该任务的业务代码主动要求切换,即主动让出执行权限发生了IO,...
      99+
      2023-07-02
    • golang协程关闭实例分析
      本篇内容主要讲解“golang协程关闭实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“golang协程关闭实例分析”吧!场景结合如下典型场景,主进程中起多个协程,这些协程会共同消费一个数据...
      99+
      2023-07-05
    • Java的http协议实例分析
      本篇内容主要讲解“Java的http协议实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的http协议实例分析”吧!http协议的组成 http...
      99+
      2024-04-02
    • 对比Golang协程和线程的分析
      Golang协程与线程的差异解析 在现代编程语言中,多线程并发已经成为一种常见的编程模式,用于提高程序的性能和响应能力。然而,线程的创建和管理往往需要消耗大量的系统资源,同时在编程复杂性和错误处理上也存在一些...
      99+
      2024-01-24
    • PHP协程中Go+Chan+Defer的示例分析
      这篇文章主要为大家展示了“PHP协程中Go+Chan+Defer的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP协程中Go+Chan+Defer的示例分析”这篇文章吧。Swoole...
      99+
      2023-06-16
    • Go语言中协程和线程的对比分析
      Go语言协程(Goroutine)与线程(Thread)是并发编程中常见的两种概念,它们都可以用来处理并发任务,但在实现方式、调度方式、资源消耗等方面有着显著的不同。本文将深入探讨Go...
      99+
      2024-02-25
      go语言 线程 协程
    • Golang中协程与线程的特性和差异分析
      Golang中协程和线程的特点与区别分析 一. 引言Golang是一门现代化的编程语言,以其简洁、高效和并发性而闻名。在Golang中,协程和线程是实现并发编程的两种主要方式。本文将分析协程和线程的特点与区别...
      99+
      2024-01-24
      Golang 线程 协程
    • Golang中线程与协程的对比分析
      Golang中线程与协程的对比分析 在现代的软件开发中,多线程编程是一项非常常见的任务。而随着硬件技术的发展,多核处理器已经成为了主流,因此利用多线程并行处理数据已经成为了提高程序性能...
      99+
      2024-02-29
      golang 线程 协程 go语言
    • Python的进程,线程和协程实例详解
      目录相关介绍实验环境进程多进程用进程池对多进程进行操作线程使用_thread模块实现使用 threading 模块实现协程使用asyncio模块实现总结相关介绍 Python是一种跨...
      99+
      2024-04-02
    • 实例详解Python的进程,线程和协程
      目录前言前提条件相关介绍实验环境进程多进程用进程池对多进程进行操作线程使用_thread模块实现使用 threading 模块实现协程使用asyncio模块实现总结前言 本文用Pyt...
      99+
      2024-04-02
    • HTTP协议在Java和Git中的应用——Spring框架的实现方式。
      HTTP协议是应用层协议中最为重要的一种。它是Web应用程序的基础,也是现代互联网应用架构中的核心组成部分。在Java和Git中,HTTP协议的应用非常广泛,而Spring框架的实现方式则是其中一种。 一、Java中的HTTP应用 Jav...
      99+
      2023-07-24
      http git spring
    • 如何Kotlin协程用法浅析用在京东APP业务中实践
      如何Kotlin协程用法浅析用在京东APP业务中实践,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。协程定义及设计的目的:协程是...
      99+
      2024-04-02
    • Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作
      JNDI 与其他 Java 框架的关系密切,并提供了许多特性和功能,以支持其他 Java 框架。这些特性和功能包括: 名称空间集成: JNDI 提供了一个统一的名称空间视图,允许开发人员使用 JNDI 名称来访问各种命名和目录服务中的对...
      99+
      2024-02-24
      Java JNDI Java LDAP DNS RMI 命名和目录服务接口
    • Java并发编程之Fork/Join框架的示例分析
      这篇文章主要介绍了Java并发编程之Fork/Join框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Fork/Join框架的理解ForkJoinTask类属...
      99+
      2023-06-15
    • PHP和HTTP协议如何影响Spring框架的编程算法?
      在当今的互联网时代,Web应用程序的开发越来越受到关注。Spring框架是一个流行的Java开发框架,它提供了一个丰富的编程模型,可以简化Web应用程序的开发。然而,PHP和HTTP协议也是很重要的Web开发技术,它们如何影响Spring...
      99+
      2023-10-06
      http spring 编程算法
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作