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

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

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

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

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

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

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

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

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

任务

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

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

go doSomething()go doAnotherThing()

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

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

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

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

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

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

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

运行时

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

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

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

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

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

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

Stackfull协程

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

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

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

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

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

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

Stackless协程

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top