日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Rust的并發模型 vs Go的并發模型:Stackless協程 vs Stackfull協程

來源: 責編: 時間:2024-06-27 17:20:49 159觀看
導讀雖然Rust和Go都是從上一代編程語言的錯誤中吸取教訓的現代編程語言,但它們以完全不同的方式管理并發,這對性能和開發人員體驗有巨大的影響。但首先,我們為什么需要并發?今天,大多數程序與需要一定時間才能返回響應的資源進

雖然Rust和Go都是從上一代編程語言的錯誤中吸取教訓的現代編程語言,但它們以完全不同的方式管理并發,這對性能和開發人員體驗有巨大的影響。cBV28資訊網——每日最新資訊28at.com

但首先,我們為什么需要并發?cBV28資訊網——每日最新資訊28at.com

今天,大多數程序與需要一定時間才能返回響應的資源進行交互:例如網絡或磁盤。如果我們在等待網絡響應的同時完全阻塞程序的執行,這將是對硬件的一種相當低效的使用!cBV28資訊網——每日最新資訊28at.com

這就是為什么Go和Rust在等待I/O(輸入/輸出)時允許程序執行其他任務的語言特性。cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

任務

任務是可以并發執行的抽象計算單元:多個函數可以(由程序)同時處理,但它們不一定(由CPU)同時執行(它的并行性需要多個線程)。cBV28資訊網——每日最新資訊28at.com

可以使用go關鍵字在Go中生成新任務:cBV28資訊網——每日最新資訊28at.com

go doSomething()go doAnotherThing()

cBV28資訊網——每日最新資訊28at.com

在Rust中,需要使用spawn函數:cBV28資訊網——每日最新資訊28at.com

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

cBV28資訊網——每日最新資訊28at.com

在這兩種情況下,任務都由語言的運行時同時處理。cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

運行時

運行時的目的是管理和調度不同的任務,以便有效地使用硬件。cBV28資訊網——每日最新資訊28at.com

圖片圖片cBV28資訊網——每日最新資訊28at.com

Rust和Go的第一個不同之處。你不能改變Go運行時(除非你使用一個完全不同的編譯器,比如tinygo),它是內置在語言中的,而在Rust中,語言沒有提供運行時,你必須自己配置。cBV28資訊網——每日最新資訊28at.com

函數在等待某些東西(例如網絡)時將控制權交還給運行時。在Go中,這是由標準庫、語言和編譯器自動完成的,而在Rust中,它在到達await關鍵字時發生。cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

Stackfull協程

Stackfull協程又稱綠線程,或M:N線程(M個綠線程運行在N個內核線程上)是Go采用的并發模型。cBV28資訊網——每日最新資訊28at.com

在這個模型中,運行時管理輕量級(綠色)線程,并將它們調度到可用的硬件線程上。與內核線程一樣,每個任務都有自己的棧,如果需要,可以由運行時增加棧。cBV28資訊網——每日最新資訊28at.com

stackfull協程的第一個問題是,每個任務都有自己的棧,這意味著每個任務使用較少的內存量。從Go 1.22開始,線程程序使用的最小內存量是2 KiB,這意味著如果有10,000個并發任務在運行,程序將使用至少20 MiB的內存。cBV28資訊網——每日最新資訊28at.com

Stackfull協程的第二個問題是,運行時需要完全控制棧布局,這使得與其他語言(如C的FFI)的互操作性變得困難,因為運行時必須在能夠調用C代碼之前做一些準備棧的工作。這就是為什么CGO被認為是緩慢的(在現實中,CGO調用在30到75納秒內完成,在我看來這是相當快的)。cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

cBV28資訊網——每日最新資訊28at.com

Stackless協程

另一方面,Rust采用了無棧協程方法,其中任務沒有自己的棧。在Rust中,Future基本上是實現Future Trait的簡單結構,其中每個.await調用鏈被編譯成巨大的狀態機。cBV28資訊網——每日最新資訊28at.com

如果你正在用Python或c#開發,你可能已經知道async/await函數著色的巨大代價,其中同步函數不能調用async函數,反之亦然。cBV28資訊網——每日最新資訊28at.com

這就導致了許多問題,比如導致了生態系統的碎片化,其中的庫是不可互操作的,很難在程序中使用libA,因為你使用的是async而不是這個庫,而且還導致了開發人員的許多錯誤,他們阻塞了運行時的事件循環,降低了系統的性能。cBV28資訊網——每日最新資訊28at.com

這在Rust中也同樣存在,因為標準庫不提供與同步函數相同的異步函數(例如read讀取整個文件),并且因為不同的運行時甚至不能相互操作,如果你開始為tokio運行時編寫程序,你將很難將其移植到另一個運行時。cBV28資訊網——每日最新資訊28at.com

雖然這些都在Go中得到了解決,在Go中,一切都是同步的,編譯器和運行時在調用程序員看不見的異步函數時自動插入等待點,但這是以性能損失(內存和CPU)為代價的。cBV28資訊網——每日最新資訊28at.com

雖然Rust方法可以最大限度地利用機器,但它帶來了一個碎片化的生態系統,這給Rust的采用帶來了很大的麻煩。cBV28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-97002-0.htmlRust的并發模型 vs Go的并發模型:Stackless協程 vs Stackfull協程

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 大數據時代,如何保證消息的順序性?

下一篇: “數據要素 ×”大賽|2024 年“數據要素 ×”大賽廣西分賽正式啟動

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 使用Webdriver-manager解決瀏覽器與驅動不匹配所帶來自動化無法執行的問題

    1、前言在我們使用 Selenium 進行 UI 自動化測試時,常常會因為瀏覽器驅動與瀏覽器版本不匹配,而導致自動化測試無法執行,需要手動去下載對應的驅動版本,并替換原有的驅動,可能還
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • 與兆芯合作 聯想推出全新旗艦版筆記本電腦開天N7系列

    聯想與兆芯合作推出全新聯想旗艦版筆記本電腦開天 N7系列。這個系列采用兆芯KX-6640MA處理器平臺,KX-6640MA 處理器是采用了陸家嘴架構,16nm 工藝,4 核 4 線
Top 主站蜘蛛池模板: 瑞昌市| 金乡县| 宽城| 抚顺县| 菏泽市| 毕节市| 甘肃省| 石首市| 永善县| 荥阳市| 白水县| 白玉县| 乌鲁木齐市| 焉耆| 甘德县| 马关县| 皮山县| 嘉祥县| 象州县| 噶尔县| 桐庐县| 荥阳市| 凤台县| 临邑县| 溆浦县| 永泰县| 滕州市| 郓城县| 原平市| 阿拉善左旗| 武平县| 张北县| 张掖市| 禹州市| 乐亭县| 高密市| 西宁市| 邮箱| 会同县| 石景山区| 新野县|