当前位置:首页 > 科技  > 软件

Rust的并发模型 vs Go的并发模型:Stackless协程 vs Stackfull协程

来源: 责编: 时间:2024-06-27 17:20:49 274观看
导读虽然Rust和Go都是从上一代编程语言的错误中吸取教训的现代编程语言,但它们以完全不同的方式管理并发,这对性能和开发人员体验有巨大的影响。但首先,我们为什么需要并发?今天,大多数程序与需要一定时间才能返回响应的资源进

虽然Rust和Go都是从上一代编程语言的错误中吸取教训的现代编程语言,但它们以完全不同的方式管理并发,这对性能和开发人员体验有巨大的影响。h1F28资讯网——每日最新资讯28at.com

但首先,我们为什么需要并发?h1F28资讯网——每日最新资讯28at.com

今天,大多数程序与需要一定时间才能返回响应的资源进行交互:例如网络或磁盘。如果我们在等待网络响应的同时完全阻塞程序的执行,这将是对硬件的一种相当低效的使用!h1F28资讯网——每日最新资讯28at.com

这就是为什么Go和Rust在等待I/O(输入/输出)时允许程序执行其他任务的语言特性。h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

任务

任务是可以并发执行的抽象计算单元:多个函数可以(由程序)同时处理,但它们不一定(由CPU)同时执行(它的并行性需要多个线程)。h1F28资讯网——每日最新资讯28at.com

可以使用go关键字在Go中生成新任务:h1F28资讯网——每日最新资讯28at.com

go doSomething()go doAnotherThing()

h1F28资讯网——每日最新资讯28at.com

在Rust中,需要使用spawn函数:h1F28资讯网——每日最新资讯28at.com

tokio::spawn(async move {     do_something().await});tokio::spawn(async move {     do_another_thing().await});

h1F28资讯网——每日最新资讯28at.com

在这两种情况下,任务都由语言的运行时同时处理。h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

运行时

运行时的目的是管理和调度不同的任务,以便有效地使用硬件。h1F28资讯网——每日最新资讯28at.com

图片图片h1F28资讯网——每日最新资讯28at.com

Rust和Go的第一个不同之处。你不能改变Go运行时(除非你使用一个完全不同的编译器,比如tinygo),它是内置在语言中的,而在Rust中,语言没有提供运行时,你必须自己配置。h1F28资讯网——每日最新资讯28at.com

函数在等待某些东西(例如网络)时将控制权交还给运行时。在Go中,这是由标准库、语言和编译器自动完成的,而在Rust中,它在到达await关键字时发生。h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

Stackfull协程

Stackfull协程又称绿线程,或M:N线程(M个绿线程运行在N个内核线程上)是Go采用的并发模型。h1F28资讯网——每日最新资讯28at.com

在这个模型中,运行时管理轻量级(绿色)线程,并将它们调度到可用的硬件线程上。与内核线程一样,每个任务都有自己的栈,如果需要,可以由运行时增加栈。h1F28资讯网——每日最新资讯28at.com

stackfull协程的第一个问题是,每个任务都有自己的栈,这意味着每个任务使用较少的内存量。从Go 1.22开始,线程程序使用的最小内存量是2 KiB,这意味着如果有10,000个并发任务在运行,程序将使用至少20 MiB的内存。h1F28资讯网——每日最新资讯28at.com

Stackfull协程的第二个问题是,运行时需要完全控制栈布局,这使得与其他语言(如C的FFI)的互操作性变得困难,因为运行时必须在能够调用C代码之前做一些准备栈的工作。这就是为什么CGO被认为是缓慢的(在现实中,CGO调用在30到75纳秒内完成,在我看来这是相当快的)。h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

h1F28资讯网——每日最新资讯28at.com

Stackless协程

另一方面,Rust采用了无栈协程方法,其中任务没有自己的栈。在Rust中,Future基本上是实现Future Trait的简单结构,其中每个.await调用链被编译成巨大的状态机。h1F28资讯网——每日最新资讯28at.com

如果你正在用Python或c#开发,你可能已经知道async/await函数着色的巨大代价,其中同步函数不能调用async函数,反之亦然。h1F28资讯网——每日最新资讯28at.com

这就导致了许多问题,比如导致了生态系统的碎片化,其中的库是不可互操作的,很难在程序中使用libA,因为你使用的是async而不是这个库,而且还导致了开发人员的许多错误,他们阻塞了运行时的事件循环,降低了系统的性能。h1F28资讯网——每日最新资讯28at.com

这在Rust中也同样存在,因为标准库不提供与同步函数相同的异步函数(例如read读取整个文件),并且因为不同的运行时甚至不能相互操作,如果你开始为tokio运行时编写程序,你将很难将其移植到另一个运行时。h1F28资讯网——每日最新资讯28at.com

虽然这些都在Go中得到了解决,在Go中,一切都是同步的,编译器和运行时在调用程序员看不见的异步函数时自动插入等待点,但这是以性能损失(内存和CPU)为代价的。h1F28资讯网——每日最新资讯28at.com

虽然Rust方法可以最大限度地利用机器,但它带来了一个碎片化的生态系统,这给Rust的采用带来了很大的麻烦。h1F28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-97002-0.htmlRust的并发模型 vs Go的并发模型:Stackless协程 vs Stackfull协程

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 大数据时代,如何保证消息的顺序性?

下一篇: “数据要素 ×”大赛|2024 年“数据要素 ×”大赛广西分赛正式启动

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,“7
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top