[英]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 開發是不同的,但這些陳述對我來說似乎是矛盾的。
GlobalScope有EmptyCoroutineContext這意味着 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.