异步时代-java的协程路在何方
面试官:你知道协程吗?
你:订机票的那个吗,我常用。
面试官:行,你先回去吧,到时候电话联系
。。。。。。。。
很尴尬,但是事实是,很大一部分的程序员不知道协程是啥玩意,更大一部分的程序员,项目中没用到协程。
先介绍下协程吧。
计算机有进程,线程和协程。前两者大家都知道,很常见的玩意。而协程,则是基于线程之上的,自主开辟的异步任务,很多人更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread)。
协程的特点:
- 线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换。
- 线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。
- 由于在同一个线程上,因此可以避免竞争关系而使用锁。
为什么我会说到协程,这个很多java程序员都没用过的东西。第一、吸引眼球!
好了,言归正传。
是springboot2.0 webflux发布之后,很多人大呼精彩,开始各种比较他与传统selvet性能高低。其实不然,webflux的模式其实和servlet3的模式殊途荣归,都是属于线程委派模式,将业务线程丢给另外的线程池处理来达到业务异步的效果。这样的确能提高某些情况下的吞吐量,但是却不是能达到的理想状态。
为什么这么说,因为我们假如业务线程池设置的最大线程数是1000,那么在核心线程数处理不过来的时候,就会不断的新增线程数直到1000,这样系统中就会出现大量的上下文切换而导致性能损耗。
这里补充一下:CPU线程数代表能同时处理多少线程任务,至于多出来的线程任务,则是CPU根据时间片或阻塞状态不断切换线程来执行,而切换线程的时候,则需要保存当前线程的状态,和恢复要切换的线程状态,这种对性能损耗很大的。
上下文切换的规则是一个线程运行超过5ms,或者出现阻塞,比如IO操作。
而一般像我们CURD程序员的业务操作离不开大量的IO操作(数据库读写),因此,将业务丢在一个线程池中,轮到CPU给你时间片的时候,你立马就告诉CPU:走吧走吧,我还在阻塞呢。 然后让线程立马就切换,可想而知这不是一个理想的操作。同时随着线程的增大,你的内存也不断在增大。
那么这个时候我们该如何处理呢?协程,对了~
协程是怎么来处理的呢,就是对于一个阻塞的业务操作,我们不是用线程来处理,而是用用协程,这样当出现IO阻塞的时候,并且你还没运行完时间片,你不会让CPU跑掉,而是调起你的另一个协程任务,让他继续进行计算。而通常我们知道,代码纯计算执行是非常快的,5ms可能跑了N个方法了,因此这样充分的利用时间片,并且减少CPU切换的时间。
其实在go,以及kotlin中,早已原生支持了协程的概念,所以go以及kotlin的ITer会相对javaer更多的了解协程。
此时javaer欲哭无泪啊。
但是我们真的就不能用协程了吗?虽然java官方还未支持,但是确有第三方支持的,下面给大家介绍下。
Quasar
一个比较成熟的java三方协程库,熟悉之后可用于生产环境。
Alibaba Dragonwell
阿里巴巴开源的发行版jdk,老爸是阿里内部的ajdk,但是目前ajdk的协程还没继承过来,说法是在慢慢继承。
Project Loom
oracle的jvm级项目,重新实现线程模型,里面包含协程方案,目前Quasar作者已经加入。(oracle忙着发JDK呢,这个还在无限延期)
kotlin
kotlin原生支持携程,且也是基于jvm运行的语言并且可以相互调用,可以考虑相互协作。
好了,说了这么多,其实就是一句话,目前现成的像样点的纯种协程框架就只有quasar,混种的就用kotlin吧。至于quasar,会在后续文章中继续介绍。
异步时代-java的协程路在何方的更多相关文章
- Java之协程(quasar)
一.前面我们简单的说了一下,Python中的协程原理.这里补充Java的协程实现过程.有需要可以查看python之协程. 二.Java协程,其实做Java这么久我也没有怎么听过Java协程的东西,但是 ...
- 第二章 - Java与协程
Java与协程 内核线程的局限 通过一个具体场景来解释目前Java线程面临的困境.今天对Web应用的服务要求,不论是在请求数量上还是在复杂度上,与十多年前相比已不可同日而语,这一方面是源于业务量的增长 ...
- PHP下的异步尝试三:协程的PHP版thunkify自动执行器
PHP下的异步尝试系列 如果你还不太了解PHP下的生成器和协程,你可以根据下面目录翻阅 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunk ...
- 异步等待的 Python 协程
现在 Python 已经支持用协程进行异步处理.但最近有建议称添加协程以全面完善 Python 的语言结构,而不是像现在这样把他们作为生成器的一个类型.此外,两个新的关键字---异步(async)和等 ...
- Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器
WebSocket 异步风格服务器 WebSocket\Server 继承自 Http\Server,所以 Http\Server 提供的所有 API 和配置项都可以使用. # ws_server.p ...
- Swoole 中使用 HTTP 异步服务器、HTTP 协程服务器
HTTP 异步风格服务器 # http_server.php $http = new Swoole\Http\Server("0.0.0.0", 9501); // 设置服务器运行 ...
- Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端
TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...
- [lua]异步串行流程*协程
local function param_pack( params, callback ) table.insert(params, callback) return params end local ...
- Java协程实践指南(一)
一. 协程产生的背景 说起协程,大多数人的第一印象可能就是GoLang,这也是Go语言非常吸引人的地方之一,它内建的并发支持.Go语言并发体系的理论是C.A.R Hoare在1978年提出的CSP(C ...
随机推荐
- 机器学习之EM算法(五)
摘要 EM算法全称为Expectation Maximization Algorithm,既最大期望算法.它是一种迭代的算法,用于含有隐变量的概率参数模型的最大似然估计和极大后验概率估计.EM算法经常 ...
- Python自定义异常及抛出异常
""" 自定义异常 """ class MyException(Exception): # 继承异常类 def __init__(self, ...
- JavaScript -- 时光流逝(九):Window 对象、Navigator 对象
JavaScript -- 知识点回顾篇(九):Window 对象.Navigator 对象 1. Window 对象 1.1 Window 对象的属性 (1) closed: 返回窗口是否已被关闭. ...
- May 31. 2018 Week 22nd Thursday
The good seaman is known in bad weather. 惊涛骇浪,方显英雄本色. As we all know, the true worth of a person is ...
- Python爬虫-02:HTTPS请求与响应,以及抓包工具Fiddler的使用
目录 1. HTTP和HTTPS 1.1. HTTP的请求和响应流程:打开一个网页的过程 1.2. URL 2. 客户端HTTP请求 3. Fiddler抓包工具的使用 3.1. 工作原理 3.2. ...
- Linux 基本操作 (day2)
一.用户的基本操作 1.添加和删除用户(管理员): useradd 用户名: useradd taibai passwd 用户名: passwd taibai [root@localhost ~] ...
- 【Teradata】四舍五入函数
1.round函数(四舍五入) (1)dbscontrol设定使用普通四舍五入方式 //使用root用户登录数据库节点 dbscontrol display general . RoundHalfwa ...
- 数组长度为len,数组元素的范围是0到len-1,找出数组的重复元素
public static int findDuplicate(int[] nums) { int len = nums.length; //注意这里的for循环写法,在交换元素后,i没有增加,还要继 ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down
题目 题目大意 :给出一棵树,节点有点权,求每个节点的祖先中点权小于该节点的结点的个数 . 思路如下 : 从根节点开始,对树进行深度优先遍历. 当进行到节点 i 时,有: $\text{i}$ 的祖 ...
- js 文件引用传递参数
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code (function() {var hm = document.createElement(&q ...