我對一個定期被呼叫的函式有這樣的要求:
1.獲取一些輸入資訊
2.基于輸入做8個獨立的計算
3.合并這些8計算的結果并輸出合并后的結果。
由于我至少有8個處理器,我可以并行地進行這8個獨立的計算。所以我創建了下面這個函式:
fun process(in: InputType)。結果型別 {
runBlocking(Dispatchers.Default) {
val jobs = in.splitToList() .map { async { processItem(it) } }
return jobs.awaitAll()
}
}
然而,我在runBlocking的檔案中看到,它是 "在主函式和測驗中使用的。"
這個函式并不是主函式,而是在應用程式的呼叫層次中被呼叫,而在其他地方并沒有使用 Coroutines。
如果我不應該使用 runBlocking,我應該用什么來實作這一要求呢?
uj5u.com熱心網友回復:
這個答案可能有點主觀臆斷,我可能會被降權,但我認為像這樣使用runBlocking()并沒有錯。主要的一點是,不要過度使用runBlocking()作為將常規代碼轉換為coroutine代碼的廉價方式。當轉換到coroutines時,我們可能很想把runBlocking()放在代碼中的任何地方,這樣就可以了。這將是錯誤的,因為它忽略了結構化的并發,而且我們有可能阻塞那些不應該被阻塞的執行緒。
然而,如果我們的整個應用程式不是基于 Coroutines,我們只需要在某些地方使用它們,并且我們從不需要取消后臺任務,那么我認為 runBlocking() 就可以了。
另一種方法是創建CoroutineScope,并將其保留在一些具有明確定義的生命周期的服務中。然后我們可以輕松地管理后臺任務,取消它們,等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/328694.html
標籤:
