ฉันกำลังอ่าน 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
หมายถึงว่าในขณะที่ด้านนอกasync
coroutine กำลังรอ ( await
) สำหรับภายในcomputation
coroutine จนจบมัน (นอกasync
coroutine) Idles (เพราะฉะนั้นชื่อระงับ) และผลตอบแทนด้ายสระว่ายน้ำด้ายและเมื่อเด็กcomputation
เสร็จสิ้น coroutine มัน (นอกasync
coroutine ) ตื่นขึ้นมาใช้ด้ายอีกอันจากสระว่ายน้ำแล้วไปต่อ?
เหตุผลที่ฉันพูดถึงเธรดนี้เป็นเพราะhttps://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
เธรดจะถูกส่งกลับไปยังพูลในขณะที่โครูทีนกำลังรอและเมื่อการรอเสร็จสิ้นโครูทีนจะดำเนินการต่อบนเธรดที่ว่างในพูล