
你可以把 spin 的底層原理想象成一個“智能的、會休眠的調(diào)度中心”它進入一個無限循環(huán)但每次循環(huán)都會先“閉上眼睛睡覺”wait_for_work 阻塞等待。只有當?shù)讓泳W(wǎng)絡(luò)DDS拍一拍它說“有新消息來了”它才會“睜開眼睛”精準地抓取一個任務(wù)執(zhí)行處理完后如果沒別的事它又會繼續(xù)“閉上眼睛睡覺”。本質(zhì)上就是一個事件池循環(huán)讀取事件池中的人物進行觸發(fā)。而spin_once則是只讀取一幀事件池中的事件。[主程序] [執(zhí)行器 Executor] [底層中間件 DDS / Wait Set] | | | |--- 1. spin(node) -| | | | | | |--- 2. collect_entities() -----| (收集節(jié)點所有的訂閱、定時器、服務(wù)等句柄) | | | | |--- 3. 進入 while 無限循環(huán) ---| | | | | |--- 4. 構(gòu)建/更新 Wait Set ----| (將收集到的句柄注冊到 Wait Set 中) | | | | |--- 5. wait_for_work() -------| (?? 核心阻塞點線程在此掛起休眠) | | | | | |--- [事件發(fā)生收到新消息/定時器到期] | | | | |-- 6. 喚醒線程返回就緒句柄 --| | | | | |--- 7. get_next_executable() --| (按優(yōu)先級尋找下一個可執(zhí)行任務(wù)) | | | | |--- 8. execute_any_executable()| (