关于Java协程和Kilim的一些概念

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程 你将懂得协程和线程的区别、协程的原理与优缺点、以及怎样在Java中使用协程 阅读详情

最近了解了一下基于协程来做异步话的场景。一些基本概念写在这里。

 

    ​    ​多任务调度方面,操作系统怎么搞的?

        一种是抢占式,指操系统给每个任务一定的执行时间片,在到达这个时间片后,如果任务仍然没有释放对CPU的占用,则操作系统强制释放,这是目前多数操作系统实现的方式。

        一种是协作式,指操作系统按照任务的顺序来分配CPU,每个任务执行过程中除非主动释放,否则将一直占据CPU,一旦任务占据CPU不放,会导致其他任务饿死,目前操作系统不太采用这种方式。

 

        通常程序如何支持高并发?

        一种是基于操作系统提供的多进程或者多线程的机制,每个任务占据一个进程或一个线程,当任务中有IO等等待操作的时候,将进程或者线程放入调度队列,这种是目前大多数程序采用的方式,这种方式的坏处就是如果想支持高并发的并发量,不得不创建很多的进程或者线程,而进程或者线程又消耗了大量的资源。,同时大量的进程或者线程,需要花费很多时间在上下文切换上,切换动作需要做状态的保持和恢复,很是消耗资源。   

        一种是每个任务不完全占据一个进程或者线程,当任务在执行过程中,需要等待IO等资源时,任务将所占据的进程或者线程释放,以便其他任务使用这个进程或者线程,这种方式的好处在于可以减少所需要的原生的进程或者线程数,并且切换完全自行来实现,成本相对于操作系统来很低。

 

        什么是协程(Coroutine)?

        每个任务不完全占据一个进程或者线程,当任务在执行过程中,需要等待IO等资源时,任务将所占据的进程或者线程释放,以便其他任务使用这个进程或者线程。各种语言对于协程支持时,多数都采用了Actor Modle来实现,每个任务就是一个Actor,Actor之间通过消息来进行交互,而不是采用共享的方式。Actor可以看做是一个轻量级的进程或者线程。

 

        Java和协程的关系?

        目前java没有从语言层面支持Coroutine(Scala 和erLang有支持),kilim是基于java来实现Coroutine的框架。对于java来说,由于一个线程只能处理一个请求,即使线程中有很多 IO中断、锁等也是如此。因此通用的做法是启动多个线程来支持高并发,当时线程多是,就造成了需要消耗不少时间在线程的切换上,从而出现瓶颈,按照协程的描述,理论上协程能够提升很多性能。

    ​    ​目前来看,JDK8中也不会包含协程的东西,目前比较成熟的就是kilim框架了。

 

        什么场景下适合做协程序(针对java应用)?

        只有大量的处理线程,都消耗在等待后端的处理是,做异步化才有意义,例如共计200个处理线程,其中有180多个的处理时间在等待后端处理,这种情况下,增加处理线程,如果不行再来考虑异步化改造,目前java在协程方面还不是很成熟,使用中可能遇到问题,例如锁、同步IO,都是协程的灾难。

 

    ​    ​Kilim框架做了啥?

    ​    ​    ​1、利用字节码增强(基于ASM字节码框架),将普通代码转化为支持协程的代码;

    ​    ​    ​2、调用pausable的时候,如果pause了就保存当前方法栈的State,停止执行,将控制权交给调度器;

    ​    ​    ​3、调度器负责协调就绪的协程;

    ​    ​    ​4、协程resume的时候,自动恢复State,回复到上次执行的位置继续执行;

 

JAVA:Spring Boot 集成 Kilim 协程实践 本文介绍了如何在Spring Boot项目中集成Kilim协程框架来构建高并发应用。Kilim通过字节码增强实现轻量级协程,支持无阻塞I/O和消息传递,单线程可管理数十万协程,大幅降低线程切换开销。文章详细展示了配置步骤、异步任务实现、服务集成以及Mailbox通信的代码示例,并列举了Kilim在高并发API、微服务通信等场景的应用优势。该框架为Java开发者提供了一种比传统线程更高效的并发编程方案,特别适合需要处理海量并发的现代分布式系统。 阅读详情

相关推荐

如何实现VMware虚拟机上的ubuntu与windows主机共享文件夹

windows主机部分   在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 接下来右键属性,操作如下系列图所示: 在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 成功修改后,显示如下界面: VMware部分 ubuntu在关机状态下,点击“编辑虚拟机设置” 接下来,开启ubuntu系统,在终端输入: ·· vmware-hgfsclient ·· 将会显示如下画面,但是此时你可能找不到 /mnt/hgfs 这个路径,如果找不到该路径,则需要在虚拟

Mr.Sliver的博客 8220

关于java协程和kilim的一些概念

        最近了解了一下基于协程来做异步话的场景。一些基本概念写在这里。       ​    ​多任务调度方面,操作系统怎么搞的?         一种是抢占式,指操系统给每个任务一定的执行时间片,在到达这个时间片后,如果任务仍然没有释放对CPU的占用,则操作系统强制释放,这是目前多数操作系统实现的方式。         一种是协作式,指操作系统按照任务的顺序来分配CPU,每个任...

iamzhongyong的专栏 286

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.youkuaiyun.com/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3934

java携程kilim,Java协程框架–Kilim源码分析 | 学步园

Kilim 是一个用于在Java 协程框架,Kilim协程框架的结构图如下:1. Task可以认为Task 就是Actor,使用方式和Java Thread 基本相同,只是继承的为Task,覆盖的为execute 方法,启动也是调用task 的start 方法。public Task start() {if (scheduler == null) {setScheduler(Scheduler.g...

weixin_36484814的博客 389

STM32驱动SPL06-001气压传感器:I2C通信与温度补偿实战

气压传感器在无人机定高、室内定位和气象监测中至关重要。SPL06-001凭借±0.06 hPa相对精度和I2C接口,成为STM32项目的理想选择。通过I2C总线读取原始数据,并利用出厂校准系数进行温度补偿和气压解算,可输出高精度气压值。本文详细解析SPL06-001的寄存器操作、校准系数拼接及补偿算法,并分享I2C上拉电阻、地址配置等避坑经验,帮助开发者快速实现气压测量与高度解算。

weixin_29188043的博客 341

【视频监控国标GB/T28181】无人机的视频图传技术

然而,随着无人机市场的不断发展和无人机视频图传技术的迅速进步,一些厂家正积极探索更多的传输方式。如今,一些大疆无人机已经具备了4G辅助图传功能,这意味着它们需要在无人机上安装相应的SIM卡,并在有移动互联网信号的情况下,通过互联网进行视频图传。这种技术的应用,不仅提高了无人机的操作灵活性,也使得无人机在各个领域的应用更加广泛。在使用时,用户需时刻注意无人机的飞行距离。在无人机图传系统中,OFDM技术的运用更是如虎添翼,显著增强了视频传输的品质与稳定性,尤其在错综复杂的电磁环境中,更能凸显其不可替代的优势。

开源物联网项目商业化作者 5663

kilim 手动编织

kilim框架的代码实现之后还要用到一个kilim.tools.Weaver的泪惊醒编织之后才能运行,否则会报############################################################Task class kilimTest.Customer has either not been woven or the classpath is incorrect########################################################

theolda的专栏 2276

【图像识别】基于计算机视觉实现红绿灯识别matlab代码

​ 1 简介 现如今,盲人出行依旧是一大问题.面对无处不在的红绿灯,盲人无法通过眼睛辨识红绿灯的状态,出行受阻.为了解决盲人识别红绿灯的难题,本文提出了一种基于MATLAB进行红绿灯识别的系统.对交通灯的识别主要基于对交通灯的色彩及形状特征.基于信号灯的亮度对其进行分割,提取,并设置了一种自动最优选择阈值的方法.再由HIS彩色空间的H信息识别颜色.最后根据二值化的交通灯的横坐标和纵坐标方向的投影进行形状匹配识别. 2 部分代码 clc clear all close all a=imread('m

qq_59747472的博客 2691

关于协程的学习记录

线程之间是如何协作的呢? 最经典的例子就是生产者、消费者模型 这个模式性能不高,原因如下: 涉及到同步锁 涉及到线程阻塞状态和可运行状态之间的切换 涉及到线程上下文的切换 这个时候协程就登场了。 什么是协程 协程,英文Coroutines,是一种比线程更加轻量级的存在,一个线程拥有多个协程, 重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行) 小tips:用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可能被其他程序获取。 内核态:c

Yqy_12的博客 200

深入解析:AndroidManifest.xml 与 Qt 6.7.0 的整合

本文探讨了在Qt 6.7.0和CMake构建Android应用时,AndroidManifest.xml未被正确识别的问题。通过分析CMake配置错误、文件路径问题等可能原因,提出了在CMakeLists.txt中明确指定路径、确保目录结构正确等解决方案,并给出了示例项目演示。文章强调正确配置AndroidManifest.xml对获取权限和应用功能的重要性,为Qt开发者提供了实用的调试建议。

2501_90323865的博客 110

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 352

java并发(三十四)协程kilim

[size=xx-large]概述[/size] 对协程的技术已经觊觎很久,他有高性能的优点,但目前工具对他支持的不是很好,调试繁琐。苦于运维和调试比较困难,一直望而却步。恰逢十一,决心攻下这块碉堡。这边文章只是个引子,后续会做更详细的描述,不断完善。贴出实践的经验。 Java里成熟一点的框架属kilim,这个发音让我想起了俄罗斯的克林姆林宫。 顺便欣赏下美景吧。 [img]http:...

报喜鸟 478

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java-协程

为什么80%的码农都做不了架构师?>>> ...

weixin_33738578的博客 82

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

协程-初探

目录 1.协程定义 2.进程,线程,协程 3.协程优点 3.1.内存小 3.2.效率高 3.3.减少同步锁 3.4.同步代码思维写异步代码 4.协程的缺点 4.1.无法利用多核资源 4.2.协程中不能有阻塞操作 4.3.CPU密集型不是长处 5.Java实现协程(Kilim)的原理 6.例子 1.协程定义 Coroutines are co...

Aaron_涛 1852

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

软件开发中涉及操作系统知识总结—线程、进程与协程

软件开发中经常会涉及到多线程处理多任务,牵扯到进程与协程的一些知识。 一、理论: 1.操作系统中的线程 2.操作系统中的进程 3.操作系统中协程的概念 二、java语言中的线程、协程 1.多线程处理: (一) Tread与Runable (二)jdk1.5之后的并发包 2.java中的协程

码农帮的专栏 1264

c语言父线程和子线程的通信,【小家java】Java中主线程(父线程)与子线程的通信和联系...

相关阅读进程和线程(和协程)通俗的讲, 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位(比如QQ是个进程、微信是个进程)进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通...

weixin_33585889的博客 298

Java性能优化七、多线程调优2

文章目录多线程调优2一、并发容器的使用:识别不同场景下最优容器1、并发场景下的 Map 容器1.Hashtable与ConcurrentHashMap2.ConcurrentHashMap与ConcurrentSkipListMap3.什么是跳跃表2、并发场景下的 List 容器总结二、如何设置线程池大小1、线程池原理2、线程池框架 Executor3、计算线程数量总结三、如何用协程来优化多线程业务1、线程实现模型2、协程的实现原理3、Kilim 协程框架总结 多线程调优2 一、并发容器的使用:识别不同场.

小宇哥x的博客 868

上下文切换调优-性能设计沉思录(9)

上下文原理和诱因、场景 ,上下文锁竞争优化 ,线程池设置&优化 ,协程优化多线程 ,容器选择与优化&强一致性,弱一致性

AI 1110
上一篇: 协程和异步
下一篇: Java 开发 2.0: Kilim 简介
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值