Tokio[1]的 task (一個(gè) Future ) 里如果使用了阻塞調(diào)用,例如std::Mutex
,會(huì)阻塞當(dāng)前的 tokio-worker 線程,這個(gè) worker 無(wú)法再執(zhí)行其他 task。所以代碼里如果不可避免的有(少量的)阻塞調(diào)用,就要為 runtime 啟動(dòng)更多的 worker 線程,保證存在沒(méi)被阻塞的 worker 來(lái)執(zhí)行待調(diào)度的 task,以避免整個(gè) tokio runtime 完全 hang 住(有 task 但沒(méi) worker 運(yùn)行它)。
但現(xiàn)實(shí)是,就算 worker 再多,tokio 也可能造成永久性的阻塞。
原因是 tokio 里的待執(zhí)行 task 不是簡(jiǎn)單的放到一個(gè) queue 里,除了 runtime 內(nèi)共享的,可被每個(gè) worker 消費(fèi)的run_queue
[2],每個(gè) worker 還有一個(gè)自己的lifo_slot
[3],只存儲(chǔ)一個(gè)最后被放入的 task (目的是減小調(diào)度延遲)。lifo_slot
只由它所屬的 worker 使用,里面存儲(chǔ)的 task 不能被其他 worker 執(zhí)行。由于這個(gè)結(jié)構(gòu),構(gòu)造 hang 住的方法是如圖所示:
-
?Future f1 被 runtime-1 執(zhí)行, 持有一個(gè) async 的鎖
m
后,返回了Pending
,這時(shí)它被調(diào)度到 worker-1 本地的lifo_slot
。 -
?Future f2 在 runtime-1 執(zhí)行后返回
Pending
,被放入共享隊(duì)列run_queue
。 -
?Future f3 在 runtime-1 中執(zhí)行, 它將一個(gè)任務(wù)
f4
交給其他的 runtime 去完成(例如為了隔離網(wǎng)絡(luò)IO和本地磁盤(pán)IO),使用block_on(f4)
[4]的方式,等待執(zhí)行結(jié)果返回。 -
? f4 中也需要鎖
m
,等待。
這時(shí),f2 在共享隊(duì)列run_queue
中,可以被執(zhí)行,但是 f1 在 worker-1 本地的lifo_slot
里,只能由 worker-1 調(diào)度,但 worker-1 當(dāng)前阻塞在 f3。于是等待關(guān)系形成了一個(gè)環(huán):f4 → m(f1) → f3 → f4
,hang 死任務(wù)達(dá)成。
審核編輯 :李倩
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4533瀏覽量
87468 -
線程
+關(guān)注
關(guān)注
0文章
508瀏覽量
20224 -
Worker
+關(guān)注
關(guān)注
0文章
8瀏覽量
6595 -
Tokio
+關(guān)注
關(guān)注
0文章
12瀏覽量
184
原文標(biāo)題:Tokio 中 hang 死所有 worker 的方法
文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
什么是Tokio模塊 Channel?
鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程TaskPool和Worker的對(duì)比(三)
HarmonyOS NEXT 原生應(yīng)用/元服務(wù)-ArkTS代碼調(diào)試worker/taskpool調(diào)試
TaskPool和Worker的對(duì)比分析
面向?qū)ο笄度胧綄?shí)時(shí)操作系統(tǒng)Worker1.0

normal worker_pool詳細(xì)的創(chuàng)建過(guò)程代碼分析

WasmEdge增加了Tokio支持
Tokio 模塊的優(yōu)雅停機(jī)機(jī)制
如何使用Tokio 和 Tracing模塊構(gòu)建異步的網(wǎng)絡(luò)應(yīng)用程序
如何使用 Tokio 模塊的Channel
tokio模塊channel中的使用場(chǎng)景和優(yōu)缺點(diǎn)
Tokio 的基本用法
Channel模塊的使用方法示例
鴻蒙語(yǔ)言基礎(chǔ)類庫(kù):ohos.worker 啟動(dòng)一個(gè)Worker

評(píng)論