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

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

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

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

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

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

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

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

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

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

任務

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

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

go doSomething()go doAnotherThing()

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

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

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

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

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

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

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

運行時

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

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

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

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

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

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

Stackfull協程

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

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

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

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

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

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

Stackless協程

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

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

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

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

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

雖然Rust方法可以最大限度地利用機器,但它帶來了一個碎片化的生態系統,這給Rust的采用帶來了很大的麻煩。Ljd28資訊網——每日最新資訊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
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網口+USB 3.0這次全都有

    2021年11月的時候,中興先后發布了兩款路由器產品,中興AX5400和中興AX5400 Pro,從產品命名上就不難看出這是隸屬于同一系列的,但在外觀設計上這兩款產品可以說是完全沒一點關系
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • Raft算法:保障分布式系統共識的穩健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁“充值中心”入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 三星折疊屏手機去年銷售近1000萬臺 今年目標定為1500萬

    7月29日消息,三星率先發力可折疊手機市場,在全球市場已經取得了非常亮眼的成績,接下來會進一步鞏固和擴大這一優勢。三星在推出Galaxy Z Flip5和Galax
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
Top 主站蜘蛛池模板: 叙永县| 绍兴县| 郑州市| 邯郸市| 曲阳县| 大洼县| 丹寨县| 禹州市| 施甸县| 韩城市| 京山县| 荣昌县| 江津市| 太和县| 东源县| 佛冈县| 清水河县| 奉新县| 武威市| 沽源县| 稷山县| 太仆寺旗| 囊谦县| 正定县| 宝应县| 石渠县| 舟曲县| 浦江县| 蒙山县| 蓬莱市| 涡阳县| 山丹县| 鄯善县| 化隆| 五河县| 汝州市| 沾益县| 扎囊县| 台东市| 丹寨县| 墨玉县|