ฉันกำลังอ่าน Kotlin Coroutine และรู้ว่ามันขึ้นอยู่กับsuspendฟังก์ชัน แต่suspendหมายความว่าอย่างไร?
โครูทีนหรือฟังก์ชันถูกระงับ?
จากhttps://kotlinlang.org/docs/reference/coroutines.html
โดยทั่วไปโครูทีนคือการคำนวณที่สามารถระงับได้โดยไม่ต้องบล็อกเธรด
ฉันได้ยินคนพูดว่า "ระงับฟังก์ชัน" บ่อยๆ แต่ฉันคิดว่ามันเป็นโครูทีนที่ถูกระงับเพราะรอให้ฟังก์ชันเสร็จสิ้น? "ระงับ" มักจะหมายถึง "หยุดการทำงาน" ในกรณีนี้โครูทีนไม่ได้ใช้งาน
🤔เราควรบอกว่าโครูทีนถูกระงับหรือไม่?
โครูทีนใดถูกระงับ
จากhttps://kotlinlang.org/docs/reference/coroutines.html
หากต้องการดำเนินการเปรียบเทียบต่อไป await () อาจเป็นฟังก์ชันระงับ (ดังนั้นจึงสามารถเรียกได้จากภายในบล็อก async {}) ที่ระงับโครูทีนจนกว่าการคำนวณบางส่วนจะเสร็จสิ้นและส่งคืนผลลัพธ์:
async { // Here I call it the outer async coroutine
...
// Here I call computation the inner coroutine
val result = computation.await()
...
}
🤔มีข้อความว่า "ระงับโครูทีนจนกว่าการคำนวณบางอย่างจะเสร็จสิ้น" แต่โครูทีนก็เหมือนด้ายที่มีน้ำหนักเบา ดังนั้นหากโครูทีนถูกระงับการคำนวณจะทำได้อย่างไร?
เราเห็นawaitว่าถูกเรียกcomputationดังนั้นมันอาจจะเป็นasyncผลตอบแทนDeferredซึ่งหมายความว่ามันสามารถเริ่มต้นโครูทีนอื่นได้
fun computation(): Deferred<Boolean> {
return async {
true
}
}
🤔คำพูดบอกว่าระงับโครูทีน หมายถึงโครูsuspendทีนชั้นนอกasyncหรือโครูsuspendทีนชั้นในcomputation?
ไม่suspendหมายถึงว่าในขณะที่ด้านนอกasynccoroutine กำลังรอ ( await) สำหรับภายในcomputationcoroutine จนจบมัน (นอกasynccoroutine) Idles (เพราะฉะนั้นชื่อระงับ) และผลตอบแทนด้ายสระว่ายน้ำด้ายและเมื่อเด็กcomputationเสร็จสิ้น coroutine มัน (นอกasynccoroutine ) ตื่นขึ้นมาใช้ด้ายอีกอันจากสระว่ายน้ำแล้วไปต่อ?
เหตุผลที่ฉันพูดถึงเธรดนี้เป็นเพราะhttps://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
เธรดจะถูกส่งกลับไปยังพูลในขณะที่โครูทีนกำลังรอและเมื่อการรอเสร็จสิ้นโครูทีนจะดำเนินการต่อบนเธรดที่ว่างในพูล
