關于 Rust 異步(無棧協程)的相關疑問

這是一個記錄問題+求助的文章。

關于 waker 與運行時的合作方式

我膚淺地學習了 Rust 異步底層實現原理,關于 Future、waker 和運行時等。關于 waker 我有三點猜測:

  1. waker 是由實現執行器的人提供的
  2. 在執行器中會調用 epoll_wait,epoll 返回 fd,執行器找到對應的 waker,調用 wake() 通知任務繼續
  3. 最底層的 future 是人工實現的,而不是編譯器生成的,future 內部調用 cx.waker() 獲取 waker,在任務無法繼續執行時,把 waker 注冊到特定運行時的注冊表中,與 fd 關聯。調用 epoll_ctl 注冊 fd。

我想知道既然 Future 要把 waker 注冊給運行時,使得運行時知道這個 waker 是與某個 fd 關聯的。那么實現這個 Future 的 poll 方法時,就應該知道這個 Future 將來會被哪個運行時調用,從而知道怎么給這個運行時注冊 waker。但真的是這樣嗎,這樣豈不就決定了這個 Future 不能被其他運行時調用了?或者說 Rust 生態中,你要實現一個異步庫,就必須得選定一個運行時,干脆用運行時提供的底層 Future,自己只是實現一些上層的應用邏輯?

關于無棧協程的傳染性

這種說法的來源是哪里?網上有人說無棧協程以“函數返回”的方式完成從協程到主協程(或者說正常線程執行流)的切換,所以協程執行過程中創造的棧沒有被保存,最終導致傳染性。而傳染性是指調用 await 的地方,必須在 async,而 async 又必須以 await 的形式調用,這樣傳入到最外層也都是 async/await 了。

但是“必須在 async 里調用 await”不只是一個編譯器規定嗎,如果編譯器沒這么規定就沒有傳染性了?一定有人說,編譯器之所以這么規定是因為“無棧”的設計,這么規定是必然的。但 async 函數實際上是 impl Future 類型,對 Future 的 poll 是沒有傳染性的(可以在一般的非 async 函數中 poll),而 Future poll 的過程也會在不同的地方中斷,其局部變量等上下文不也保存的好好的?無棧只是指局部變量不以棧的形式保存,也不以切換上下文的形式切換。

我沒用過太多 Rust 異步特性,用的也都是在很高層次上使用。我覺得為了理解上述問題可能需要閱讀一些異步庫,甚至自己寫一個小的 tokio。(閱讀 tokio 的源碼是不是太難了,有沒有 mini-tokio 啊)

BTW,我是不是不應該指望?csdn 的環境能有人回答我的問題呀hh,希望有大佬能參與討論

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stm32項目(25)——基于stm32的植物生長箱環境監測系統

1.實現功能 測 環境溫濕度、光照強度、土壤濕度、水箱水位 手機APP顯示 溫度過低-->打開加熱板 濕度過低-->打開水泵 土壤濕度低-->開水泵 --->只要有指標低于閾值時 就蜂鳴器報警 光強弱-->補光 水位低-->抽水 OLED屏幕實時顯示各種信息 分…

golang 基礎案例_02

1.鎖有時候我們的代碼中可能會存在多個 goroutine 同時操作一個資源(臨界區)的情況,這種情況下就會發生競態問題(數據競態)。(1)、互斥鎖;(2)、讀寫互斥鎖;(3)、sync.WaitGroup;(4)、…

C++算法·前綴和

前綴和(Prefix(Prefix(Prefix Sum)Sum)Sum)的定義 前綴和是一種高效處理區間求和問題的算法技巧 其核心思想是通過預處理構建一個前綴和數組 使得后續的區間和查詢可以在常數時間O(1)O(1)O(1)內完成 核心概念 定義 給定一個數組a[1...n]a[1...n]a[1...n],其前綴和數組s[1...…

JavaEE 初階第十七期:文件 IO 的 “管道藝術”(下)

專欄:JavaEE初階起飛計劃 個人主頁:手握風云 目錄 一、Java文件內容寫入 1.1. OutputStream 二、字符流讀取和寫入 2.1. Reader 2.2. Writer 三、示例練習 3.1. 查找文件功能 一、Java文件內容寫入 1.1. OutputStream OutputStream同樣只是?個抽…

【liunx】web高可用---nginx

NGINX簡介Nginx(發音為 “engine x”)是一款由俄羅斯程序員 Igor Sysoev 開發的 輕量級、高性能的 HTTP 和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器。自 2004 年首次發布以來,Nginx 憑借其 高并發處理能力、低內存…

FPGA+護理:跨學科發展的探索(二)

FPGA護理:跨學科發展的探索(二) 系列文章目錄 FPGA護理:跨學科發展的探索(一) 文章目錄FPGA護理:跨學科發展的探索(二)系列文章目錄引言三、FPGA 在精神醫學護理中的應用…

localforage的數據倉庫、實例、storeName和name的概念和區別

在 localForage 中,數據倉庫、實例、storeName 和 name 是核心概念,用于管理底層存儲(IndexedDB/WebSQL/localStorage)。以下是詳細解釋和區別: 1. 數據倉庫 (Database) 定義:指底層的物理數據庫&#xff…

使用MAS(Microsoft Activation Scripts)永久獲得win10專業版和office全套

文章目錄Microsoft Activation Scripts簡介下載地址使用方法Microsoft Activation Scripts簡介 MAS是Microsoft Activation Scripts縮寫。 主要提供如下功能: 使用該腳本可以永久獲得win10專業版和office全套(可選) 下載地址 https://pan…

零 shot 語義+在線閉環:深度學習讓機器人學會“主動”

來gongzhonghao【圖靈學術計算機論文輔導】,快速拿捏更多計算機SCI/CCF發文資訊~在當下,機器人與深度學習的融合正成為AI領域的核心發展趨勢,相關研究在頂會頂刊上熱度居高不下。從ICLR到CoRL,諸多前沿成果不斷涌現&am…

Nginx學習筆記(三)——在 CentOS 7 中配置阿里云鏡像源

📚 Nginx學習筆記(三)——在 CentOS 7 中配置阿里云鏡像源 在 CentOS 7 中配置阿里云鏡像源可顯著提升軟件安裝和更新的速度,以下是詳細操作步驟: 🔧 配置阿里云鏡像源步驟 1?? 備份原有源配置 sudo mv /…

WebSocket--簡單介紹

一、什么是 WebSocket?定義:WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。作用:實現客戶端(瀏覽器)和服務器之間的實時、雙向通信。優勢:連接保持,通信實時性強(不像 HT…

【STM32 LWIP配置】STM32H723ZG + Ethernet +LWIP 配置 cubemx

STM32H723ZG LAN8742 Ethernet LWIP 配置 cubemx 🌞這邊記錄一下這塊mcu 配置以太網的過程,IDE是KEIL MDK,其實就是在下面多次提到的blog的基礎上 在scatter file進行配置 首先,如果想要簡單一點 直接去cubemx 那邊獲取相關的例…

EI檢索-學術會議 | 人工智能、虛擬現實、可視化

第五屆人工智能、虛擬現實與可視化國際學術會議(AIVRV 2025)定于2025年9月5-7日在中國 成都召開。人工智能正驅動各行業智能化轉型,提升效率與質量;虛擬現實技術以其沉浸感重塑教育、娛樂、醫療等領域體驗;可視化技術…

力扣(H指數)

一、題目分析 (一)問題描述 給定一個整數數組 citations,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。我們需要計算并返回該研究者的 H 指數。根據維基百科定義:H 指數代表“高引用次數”,一名科研人員的…

標準io(1)

標準I/O基礎概念標準I/O&#xff08;Standard Input/Output&#xff09;是C語言提供的一組高級文件操作函數&#xff0c;位于<stdio.h>頭文件中。與低級I/O&#xff08;如Unix的系統調用read/write&#xff09;相比&#xff0c;標準I/O引入了緩沖機制&#xff0c;能顯著提…

線性代數1000題學習筆記

1000題線代基礎第一章1-101000題線代基礎第二章1-171000題線代基礎第三章1-11

LeetCode算法日記 - Day 8: 串聯所有單詞的子串、最小覆蓋子串

目錄 1.串聯所有單詞的子串 1.2 解法 1.3 代碼實現 2. 最小覆蓋子串 2.1 題目解析 2.2 解法 2.3 代碼實現 1.串聯所有單詞的子串 30. 串聯所有單詞的子串 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s 和一個字符串數組 words。 words 中所有字符串 長度…

linux實戰:基于Ubuntu的專業相機

核心組件就是QTimerOpenCV的組合方案攝像頭啟停控制用QPushButton實現&#xff0c;幀顯示必須用QLabel而不能用普通控件&#xff0c;視頻流刷新用QTimer比多線程更簡單想快速實現攝像頭控制功能&#xff0c;核心組件就是QTimerOpenCV的組合方案。攝像頭啟停控制用QPushButton實…

《深度剖析前端框架中錯誤邊界:異常處理的基石與進階》

錯誤邊界作為一種特殊的組件機制&#xff0c;正悄然重塑著應用應對異常的底層邏輯。它并非簡單的代碼片段組合&#xff0c;而是一套貫穿組件生命周期的防護體系&#xff0c;其核心價值在于將局部錯誤的影響牢牢鎖定在可控范圍內&#xff0c;避免整個應用陷入不可挽回的崩潰狀態…

6GB顯存玩轉SD微調!LoRA-scripts本地部署教程,一鍵煉出專屬AI畫師

一、介紹LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一個專為訓練低秩自適應&#xff08;LoRA&#xff09;模型設計的開源工具集主要應用于Stable Diffusion等AI繪圖模型的微調&#xff0c;幫助用戶高效創建定制化風格、角色或概念的輕量級模型。目前已…