簡體   English   中英

Kotlin 的啟動是在主線程還是后台線程中啟動協程?

[英]Does Kotlin's launch start a coroutine in the main or a background thread?

我正在嘗試在 Android 的后台運行任務,我想知道是否需要指定GlobalScope.launch(Dispatchers.IO) {... }或者一個簡單的GlobalScope.launch {... }是否足夠. 我擔心的是第二種形式是在主線程還是后台/IO線程中啟動協程?


根據Android 文檔

launch不需要Dispatchers.IO參數。 當您不傳遞Dispatcher來啟動時,從viewModelScope啟動的任何協程都會在主線程中運行

根據Kotlin 文檔

在 GlobalScope 中啟動協程時使用的默認調度程序由 Dispatchers.Default 表示,並使用共享后台線程池,因此launch(Dispatchers.Default) {... }使用與GlobalScope.launch {... } .

我知道協程直到最近還是實驗性的,Android-Kotlin 與純 Kotlin 開發是不同的,但這些陳述對我來說似乎是矛盾的。

GlobalScopeEmptyCoroutineContext這意味着 Dispatchers.Default 將在直接在其中啟動時使用。

演示行為的示例: https://pl.kotl.in/cLy3UfuZO

我擔心的是第二種形式是在主線程還是后台/IO線程中啟動協程?

它將在 Dispatchers.Default 下將其啟動到 CommonPool 中,它共享與 CPU 中的內核數相同的最大線程,例如,如果您的 CPU 有 6 個內核,則最大限制為 6 個線程。 然而 Dispatchers.IO 最多允許從 CommonPool 借用 64 個線程。 Dispatchers.Main 是單線程的。


viewModelScope的故事是不同的,scope 包含Dispatchers.Main作為其默認調度程序啟動。您可以創建一個 scope 像這樣CoroutineScope(Dispatchers.Main)這樣每次啟動而不指定調度程序都將在 Main 中啟動,類似於viewModelScope

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM