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

news2024/11/24 7:20:56

神秘使者

“久闻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,一时朝野震动

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化机器学习——贝叶斯优化

自动化机器学习——贝叶斯优化 贝叶斯优化是一种通过贝叶斯公式推断出目标函数的后验概率分布,从而在优化过程中不断地利用已有信息来寻找最优解的方法。在贝叶斯优化中,有两个关键步骤:统一建模和获得函数的优化。 1. 统一建模 在贝叶斯优…

孩子用什么样的灯对眼睛没有伤害?分享多款满分护眼台灯

为人父母以后,深感压力山大。如今不仅要抓孩子的学习,还得时刻关注孩子的身心健康,尤其是视力问题。现在不少学生都存在近视的现象,而导致这一现象的主要原因,除了平时的学业压力过大以外,夜晚学习的光线也…

美港通正规炒股市场恒生科指半日跌近2% 大型科技股集体下行

查查配5月7日电 7日,港股主要股指回调。截至午盘,恒生指数跌0.85%,恒生科技指数跌1.98%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投资体验。 来源:Wind 盘面上,零售、软…

用C#打造精美系统托盘消息提醒,让你的应用更具魅力

使用效果: 代码: #region 消息框变量private Timer fadeTimer; // 定义计时器private int fadeSpeed 2;//淡出速度private NotifyIcon notifyIcon;//气泡通知private int opacityLevel 10;//不透明度public enum NotificationType{Error,//错误Warning…

Golang | Leetcode Golang题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; func minWindow(s string, t string) string {ori, cnt : map[byte]int{}, map[byte]int{}for i : 0; i < len(t); i {ori[t[i]]}sLen : len(s)len : math.MaxInt32ansL, ansR : -1, -1check : func() bool {for k, v : range ori {if c…

Linux网络编程(三)IO复用一 select系统调用

I/O复用使得程序能同时监听多个文件描述符。在以下场景中需要使用到IO复用技术&#xff1a; 客户端程序要同时处理多个socket&#xff0c;非阻塞connect技术客户端程序要同时处理用户输入和网络连接&#xff0c;聊天室程序TCP服务器要同时处理监听socket和连接socket服务器要同…

美国站群服务器的CN2线路在国际互联网通信中的优势?

美国站群服务器的CN2线路在国际互联网通信中的优势? CN2线路&#xff0c;或称中国电信国际二类线路&#xff0c;是中国电信在全球范围内建设的高速骨干网络。这条线路通过海底光缆系统将中国与全球连接起来&#xff0c;为用户提供高速、低延迟的网络服务。CN2线路在国际互联网…

抖音小店是什么?为什么要去做呢?这几点原因告诉你真相!

大家好&#xff0c;我是电商小V 抖音小店就是抖音平台进军电商行业的踏板&#xff0c;也是抖音内的电商购物业务&#xff0c;咱们就可以理解成可以在抖音平台上面卖货&#xff0c;和淘宝&#xff0c;多多店铺&#xff0c;线下超市都是一个性质的&#xff0c;但是运营的模式不同…

C++ | Leetcode C++题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int p0 0, p2 n - 1;for (int i 0; i < p2; i) {while (i < p2 && nums[i] 2) {swap(nums[i], nums[p2]);--p2;}if (nums[i…

AI助力制造行业探索创新路径

近期&#xff0c;著名科技作家凯文凯利&#xff08;K.K.&#xff09;来到中国&#xff0c;发表了一场演讲,给广大听众带来了深刻的启示。他在演讲中强调了人工智能&#xff08;AI&#xff09;对全球经济的重大影响&#xff0c;并提出了AI发展的多个观点&#xff1a; AI的多样性…

KAN: Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接&#xff1a;https://arxiv.org/abs/2404.19756 代码链接&#xff1a;https://github.com/KindXiaoming/pyKAN 项目链接&#xff1a;https://kindxiaoming.github.io/pyKAN/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

20240508每日后端---聊聊内存溢出报警自动导出堆文件

1-Xms 内存溢出阈值 -Xmx -Xx:printGcDetail 2-xx:heapdumponoutofmemoryError 3-xx:heapdumppath文件输出路径

如何搭建PHP平台圈子是圈子小程序源码一个系统的软件搭建平台促进交流圈子经济运营模式-APP小程序H5前后端源码交付,一次购买,终生使用。

独立自主的专属APP 可上架至Appstore和各家安卓应用市场 接入现有APP 通过标准接口&#xff0c;快速接入企业已有业务APP 微信平台完美兼容 公众号h5、小程序、企业微信均得以支持 版块、分类结构 版块二级分类、版块内帖子主题分类 频道功能 跨版块、自定义选择条件、…

实验11:静态路由和默认路由故障排除(课内实验)

1、实验目的及要求&#xff1a; 掌握静态路由和默认路由故障排除的过程&#xff0c;在基于IPv4和IPv6双协议栈的网络中能够查找相关的配置问题&#xff0c;完成网络故障的分析和排除&#xff0c;进行相关网络联通性的测试。 2、实验设备&#xff1a; 路由器3台、二层交换机3台、…

用AI评估AI,上交大新款大模型部分任务超越GPT-4,模型数据都开源

评估大模型对齐表现最高效的方式是&#xff1f; 在生成式AI趋势里&#xff0c;让大模型回答和人类价值&#xff08;意图&#xff09;一致非常重要&#xff0c;也就是业内常说的对齐&#xff08;Alignment&#xff09;。 “让大模型自己上。” 这是上海交通大学生成式人工智能…

SpringBoot项目配置HTTPS接口的安全访问

参考&#xff1a;https://blog.csdn.net/weixin_45355769/article/details/131727935 安装好openssl后&#xff0c; 创建 D:\certificate CA文件夹下包含&#xff1a; index.txt OpenSSL在创建自签证书时会向该文件里写下索引database.txt OpenSSL会模拟数据库将一些敏感信息…

Flask-大体了解介绍

初识Flask Flask是使用 Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理&#xff0c;更方便高效地编写Web程序。 Flask主要有两个依赖&#xff0c;一个是WSGI&#xff08;Web Server Gateway Interface&#xff0c;Web服务器网关接口&#xff09;工具集…

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …

聚观早报 | 比亚迪首款新能源皮卡;苹果M4芯片有望登场

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月8日消息 比亚迪首款新能源皮卡 苹果M4芯片有望登场 红旗首款手机外观揭晓 一加13设计细节曝光 长城汽车4月销…

5本书带你走进大厂的云原生世界

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的金融摸鱼侠&#xff0c;欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 今天和大家分享的主题是&#xff1a;大厂的云原生架构设计。公众号内回复关键字&#xff1a;【20240508】&#xff0c;即…