用一个故事告诉你协程到底是什么

神秘使者

“久闻Java语言跨越平台,框架众多,不过二十年功夫,就已晋升天下第一编程语言,今日一见,果然名不虚传呐!”

“使者先生您过奖了,咱们快些走,国王陛下已经等候多时了”

今日,Java帝国朝堂之上迎来了一位神秘的来宾。

来到大殿之上,只见国王正襟危坐,闭目养神,不怒自威,堂下群臣咸集,纷纷侧目。

“来者何人?”,国王一旁的内侍问到。

“我乃GoLang帝国使者——Goroutine”,使者答道。

“GoLang帝国?何方番邦小国?寡人竟从未听闻”,国王闭眼说到。

说罢,群臣皆笑了起来。

“来此所为何事?”,内侍继续问到。

使者回答:“我此行特为传道而来”

说完,国王睁开了眼睛,“传道?我Java帝国乃天下第一编程帝国,只有我们传出去,哪有学别人之道?”

使者不卑不亢,说到:“Java帝国虽如日中天,但却有一处缺陷,假以时日,必成大患”

“哦,你倒是说说看,如若言语不通,即刻轰出殿去。”,国王厉声喝到。

“敢问陛下,Java线程执行到阻塞函数时,该当如何?”,使者问到。

一旁的线程大臣见状,上前说到:“遇到阻塞那自然要被操作系统挂起,切换到别的线程”

“敢问大人,线程切换是否需要成本?如果大量线程频繁切换,成本又当如何?”,使者追问到。

“你若关心这个问题,那就不用阻塞函数,通过异步回调来进行”,线程大臣答道。

使者嘴角上扬,微微一笑,“好一个异步回调!异步回调确实不用阻塞,不过它有两宗罪,其一:割裂了原来的代码业务逻辑,其二:陷入回调地狱难以维护”

“这也不行,那也不行,你这人还真难伺候”,线程大臣有些急了。

使者转身面向国王说到:“启禀陛下,我有一法,可让线程遇到阻塞函数后不需切换线程,也不用异步回调还可以继续运行下去,是高并发开发神技”

国王一听来了兴趣:“哦,还有这种事?说来听听”

使者拜了一拜,说到:“线程可以在遇到阻塞的地方后,保存执行的上下文,转而去执行别处的代码。待阻塞的请求完成后,再转而回去继续执行”

国王不解,问到:“什么叫转而去执行别处的代码?什么叫回去继续执行?这函数执行到一半还能中途退出再回来?”

“是的,没错!”,使者回答。

此话一出,朝堂上议论纷纷,群臣都露出了鄙夷的笑容。

“简直荒谬!函数执行从进入到return退出,从来都是一气呵成,哪有中途执行一半退出,再回来接着执行的道理?简直闻所未闻!”,一旁的线程大臣说到。

使者继续说到:“一气呵成?恐怕不是吧?线程执行函数中途,遇到时间片用完或者遇到I/O阻塞,就会被操作系统保存上下文后挂起,切换到其他线程。而后等到机会再回过头继续执行,不是吗?”

线程大臣怒斥道:“强词夺理!你说的这情况是操作系统在调度管理多个线程,对咱们的应用层线程来说都是透明的,无需关心”

使者没有退让,却问道:“既然操作系统可以调度管理多个线程,那为何线程不可以调度管理函数的执行?

群臣再次交头接耳,议论起来。

“陛下,此番邦使者妖言惑众,微臣建议即刻逐出大殿,以正视听!”

国王应允,随即遣人上前。

不待侍卫上前,使者自行离去,边走边说到:“可叹!堂堂Java帝国,却容不下一个新技术”

临别相会

使者心灰意冷,打算离开Java帝国,却在半道上被人给拦了下来。

“先生请留步,我家主人请先生府上相会”

使者来到府上,原来主人乃当地一富豪乡绅。

“先生今日在朝堂之事,我已听说,在下对先生提到的函数执行过程中可中断和恢复的技术颇有兴趣,还请先生不吝赐教”,主人说完拜了一拜。

“赐教不敢当,我此次来Java帝国,所传之道名叫协程,是一种高并发开发的绝技,可无奈贵国国君与大臣皆不识货,无功而返,可惜啊,可惜!”,使者叹息到。

“协程?这是何物?我只听说过进程和线程,却是从未听过协程”

使者起身说到:“线程是操作系统抽象出来的执行流,由操作系统统一调度管理。那在一个线程中,同样可以抽象出多个执行流,由线程来统一调度管理。这线程之上抽象的执行流就是协程”

主人有些不解,问到:“一个线程怎么会有多个执行流呢?”

“这便是我今日在朝堂上说的,线程执行函数遇到阻塞后,可以保存上下文后退出,转而执行别处的代码,这里就从一个执行流转向了另外的执行流”,使者解释到。

主人拍案而起,“原来是这个意思,妙哉,妙哉啊!不过,这线程是操作系统在调度管理,那线程里抽象出来的执行流,也就是协程,该怎么调度管理呢?操作系统可以通过时钟中断和系统调用进入内核来剥夺线程的执行权,那线程该如何剥夺协程的执行权来实现调度管理呢?”

“真是个好问题!线程的调度由操作系统来管理,是抢占式调度。而协程不同,协程需要互相配合,主动交出执行权,这也是协程的名字——协作式程序的来历”

“主动交出执行权?如何办到?”,主人追问。

“办法有很多,比如C++帝国有一协程框架,名叫libco,他通过HOOK关键的系统函数来实现调度器的介入”

“那你们Golang是怎么做的?也是这样吗?”

“我们Golang帝国可不一样,我们先天设计就是支持协程,系统调用都被我们封装好了,应用程序调用时遇到需要阻塞的,像是文件读写Read/Write、Sleep我们的调度器就能有机会介入,去执行调度管理了”,使者得意的说到。

主人思考片刻,问到:“那我们Java该如何实现呢,还请先生赐教”

“你们Java语言,是通过JVM在执行,字节码的执行都在JVM的掌控之中,要想实现对应用代码执行流的中断和恢复还不是易如反掌?”,使者说到。

主人点了点头,若有所思。

新的征程

主人与使者交谈甚欢,不知不觉已近黄昏。

主人起身说到:“今蒙先生赐教,大慰平生。还请先生在府上多留时日,我好细细请教。”

使者连连挥手,说到:“我还有要事在身,明日就要离去”

“不知先生欲往何处?”

“听说C++帝国又要发布新版本,我打算前往传道”

主人面露疑惑:“C++帝国不是有libco了吗?”

“libco终究不是朝廷之物,此番前去,希望可以让协程纳入新的官方标准”

翌日清晨,使者拜别主人,策马离去。

不久,Java帝国朝堂上传来消息,民间有人推出了协程框架——Quasar,一时朝野震动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电机控制系列模块解析(18)—— 位置观测器

一、简要综述 无传感器控制策略中观测器的分类,主要分为两类:基于模型的方法(Model Based)和基于显著性的方法(Saliency Based)。在此借用一张文献综述的图片,下面将列出下面借用图片中的各个分…

电脑(爱好者) :基础知识1 了解你的电脑

读懂cpu 您想了解关于您的电脑的信息吗?CPuz是一款常用的系统信息工具,可以提供关于CPU、主板、内存等硬件信息的详细情况。您可以下载并运行该软件,然后查看您的电脑硬件配置信息。 图片来源于网络 CPU-Z 简介 CPU-Z 是一款功能强大且易于使…

【边东随笔】(2) 北美鳄龟的生存智慧:细心 | 信心 | 狠心 | 耐心

非常谨慎,在水域中会先找到躲避将自身安置于有利地形 ( 细心 )。 浮出水面换气,水体稍有异动就会退回水中,优秀掠食者对自身优势牢牢的把握( 信心 )。 非常优雅,猎食动作不存在任何花里胡哨&a…

Spring Boot3.x集成Disruptor4.0

Disruptor介绍 Disruptor是一个高性能内存队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年&…

css--控制滚动条的显示位置

各种学习后的知识点整理归纳,非原创! ① direction属性 滚动条在左侧显示② transform:scaleY() 滚动条在上侧显示 正常的滚动条会在内容超出规定的范围后在区域右侧和下侧显示在有些不正常的需求下会希望滚动条在上侧和左侧显示自己没有想到好的解决方案…

Vue3:menu导航栏出现多个同一跳转路径的菜单处理

文章目录 需求整理实现思路实现过程 需求整理,实现思路 最近公司想将之前老的项目整理出来,因为这个老项目内容太杂什么页面都往里面塞,导致菜单特别多,公司就像将这个老的项目迁出来,这个旧的项目本来是后端PHP写的。…

面试分享——订单超30分钟未支付自动取消用什么实现?如何使用Redis实现延迟队列?

目录 1.订单超时未支付自动取消,这个你用什么方案实现? 2.如何使用Redis实现延迟队列 2.1实验步骤 2.2实现生产可用的延迟队列还需关注什么 3.总结 电商场景中的问题向来很受面试官的青睐,因为业务场景大家都相对更熟悉,相关…

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 5插图

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 Chapter 5插图

【Verilog】big_small_cnt

通用大小计数器 timescale 1ns / 1ps // // Company: // Engineer: wengf // Create Date: // Design Name: // Module Name: big_small_cnt // Project Name: // Target Devices: // Tool Versions: // Description: // Dependencies: // Revision: // Revision 0…

超声波测距传感器--第七天

1.超声波测距 型号:HC-SR04 接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个引脚分别接我们开发板的P1.5和P1.6端 超声波模块是用来测量距离的一种产品,通过发送超声波,利用时间差和声音传播速度,计算模块到前方障碍物的距离。 2. 如何让它发送波: Tri…

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具:OpenSSL,gpg(是pgp的实现) 加密算法和协议: 对称加密:加解密使用同一个秘钥; DES:Data Encryption Standard,数据加密标准&…

【postgreessql 】查询数据库表占用物理空间

查询单个表的磁盘使用量: SELECTrelname,pg_size_pretty ( pg_total_relation_size ( relid ) ) AS total_size FROMpg_catalog.pg_statio_user_tables; 查询所有表的总磁盘使用量: SELECTpg_size_pretty ( SUM ( pg_total_relation_size ( relid ) )…

简洁大气APP下载单页源码

源码介绍 简洁大气APP下载单页源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 效果截图 源码下载 简洁大气APP下载单页源码

[oeasy]python0016_在vim中直接运行python程序

回忆上次内容 上次 置换 esc 和 caps lock 任何操作 都可以在不移动 手腕的状态下完成了 每次都要 退出vim编辑器😴 才能 在shell中 运行python程序有点麻烦 想要 不退出vim 直接在 vim应用 中运行 py程序可能吗?🤔 运行程序 以前都是 先退…

0507华为od二面

只记录自己没回答上的问题 1、ZGC的缺点: 1)只是适用于32位系统 2)最大只是支持4TB内存容量 3)最糟糕的情况下吞吐量会下降15%,这都不是事至于吞吐量,通过扩容分分钟解决 4)分代的原因:不同对象的生命周期不相同,可能会扫描整个堆…

TiDB数据库 使用tiup 缩容遇到的tikv处于下线中状态无法转为tombstone状态

官方的缩容文档 https://docs.pingcap.com/zh/tidb/stable/scale-tidb-using-tiup 论坛地址 https://tidb.net/ 问题:使用tiup 缩容遇到的tikv处于下线中状态无法转为tombstone状态 解决方法 1.缩容 tiup cluster scale-in --node 10.0.1.5:20160 2.查看 tiup…

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引言 微服务是一种框架风格,按照业务板块来划分应用代码…

彻底解决python的pip install xxx报错(文末附所有依赖文件)

今天安装pip install django又报错了: C:\Users\Administrator>pip install django WARNING: Ignoring invalid distribution -ip (d:\soft\python\python38\lib\site-pac kages) Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting djan…

构建 WebRTC 一对一信令服务器

构建 WebRTC 一对一信令服务器 构建 WebRTC 一对一信令服务器前言为什么选择 Nodejs?Nodejs 的基本原理浏览器使用 Nodejs安装 Nodejs 和 NPMsocket.io信令服务器搭建信令服务器客户端服务端启动服务器并测试 总结参考 构建 WebRTC 一对一信令服务器 前言 我们在学…

Bookends for Mac v15.0.2 文献书籍下载管理

Bookends Mac版可以轻松地将其导入参考 ,并直接搜索和进口从数以百计的线上资料来源。Bookends Mac版使用内置在浏览器中下载参考与PDF格式的文件,或和/或网页的点击。 Bookends for Mac v15.0.2注册激活版下载 本文由 mdnice 多平台发布