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

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

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

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

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

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

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

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

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

任务

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

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

go doSomething()go doAnotherThing()

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

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

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

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

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

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

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

运行时

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

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

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

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

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

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

Stackfull协程

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

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

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

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

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

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

Stackless协程

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克·扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:“不仅
Top