Di kotlinx.coroutines
perpustakaan Anda dapat memulai coroutine baru menggunakan launch
(dengan join
) atau async
(dengan await
). Apa perbedaan di antara mereka?
sumber
Di kotlinx.coroutines
perpustakaan Anda dapat memulai coroutine baru menggunakan launch
(dengan join
) atau async
(dengan await
). Apa perbedaan di antara mereka?
launch
digunakan untuk menembak dan melupakan coroutine . Ini seperti memulai utas baru. Jika kode di dalam launch
terminal berakhir dengan pengecualian, maka kode tersebut diperlakukan seperti pengecualian yang tidak tertangkap di utas - biasanya dicetak ke stderr di aplikasi JVM backend dan aplikasi Android rusak. join
digunakan untuk menunggu penyelesaian coroutine yang diluncurkan dan tidak menyebarkan pengecualiannya. Namun, coroutine anak yang crash membatalkan induknya dengan pengecualian yang sesuai juga.
async
digunakan untuk memulai coroutine yang menghitung beberapa hasil . Hasilnya diwakili oleh instance Deferred
dan Anda harus menggunakannya await
. Pengecualian tanpa tertangkap di dalam async
kode disimpan di dalam hasil Deferred
dan tidak dikirim di tempat lain, itu akan diam-diam dijatuhkan kecuali diproses. Anda TIDAK HARUS melupakan coroutine yang sudah Anda mulai dengan async .
Saya menemukan panduan ini https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md berguna. Saya akan mengutip bagian-bagian penting
🦄 coroutine
Jadi Anda bisa menganggap coroutine sebagai sesuatu yang mengelola thread dengan cara yang sangat efisien.
🐤 diluncurkan
Jadi mulailah
launch
utas latar belakang, lakukan sesuatu, dan kembalikan token segera sebagaiJob
. Anda dapat memanggiljoin
iniJob
untuk memblokir sampailaunch
utas ini selesai🦆 async
Jadi mulailah
async
utas latar belakang, lakukan sesuatu, dan kembalikan token segera sebagaiDeferred
.Jadi
Deferred
sebenarnya aJob
. Lihat https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.experimental/-deferred/index.html🦋 async sangat ingin secara default
sumber
launch
danasync
digunakan untuk memulai coroutine baru. Tapi, mereka mengeksekusinya dengan cara yang berbeda.Saya ingin menunjukkan contoh yang sangat mendasar yang akan membantu Anda memahami perbedaan dengan sangat mudah
Dalam contoh ini, kode saya mengunduh 3 data dengan mengklik
btnCount
tombol dan menampilkanpgBar
bilah kemajuan hingga semua unduhan selesai. Ada 3suspend
fungsidownloadTask1()
,downloadTask2()
dandownloadTask3()
yang mengunduh data. Untuk mensimulasikannya, saya telah menggunakandelay()
fungsi-fungsi ini. Fungsi-fungsi ini menunggu5 seconds
,8 seconds
dan5 seconds
masing - masing.Seperti yang telah kita gunakan
launch
untuk memulai fungsi-fungsi ini,launch
akan menjalankannya secara berurutan (satu-per-satu) . Ini berarti,downloadTask2()
akan mulai setelahdownloadTask1()
selesai dandownloadTask3()
akan mulai hanya setelahdownloadTask2()
selesai.Seperti dalam output screenshot
Toast
, total waktu eksekusi untuk menyelesaikan semua 3 download akan menyebabkan 5 detik + 8 detik + 5 detik = 18 detik denganlaunch
Seperti yang kita lihat, ini
launch
membuat eksekusisequentially
untuk semua 3 tugas. Waktu untuk menyelesaikan semua tugas adalah18 seconds
.Jika tugas-tugas itu independen dan jika mereka tidak membutuhkan hasil perhitungan tugas lain, kita dapat membuatnya berjalan
concurrently
. Mereka akan mulai pada saat yang sama dan berjalan bersamaan di latar belakang. Ini bisa dilakukan denganasync
.async
mengembalikan sebuah instance dariDeffered<T>
tipe, di manaT
adalah tipe data yang mengembalikan fungsi menangguhkan kami. Sebagai contoh,downloadTask1()
akan kembaliDeferred<String>
karena String adalah jenis kembali fungsidownloadTask2()
akan kembaliDeferred<Int>
karena Int adalah jenis pengembalian fungsidownloadTask3()
akan kembaliDeferred<Float>
karena Float adalah tipe pengembalian fungsiKita bisa menggunakan objek kembali
async
dari tipeDeferred<T>
untuk mendapatkan nilai yang dikembalikan dalamT
tipe. Itu bisa dilakukan denganawait()
panggilan. Periksa kode di bawah ini misalnyaDengan cara ini, kami telah meluncurkan ketiga tugas secara bersamaan. Jadi, total waktu eksekusi saya untuk menyelesaikan hanya akan menjadi
8 seconds
waktu karenadownloadTask2()
itu adalah yang terbesar dari semua 3 tugas. Anda dapat melihat ini di screenshot berikut diToast message
sumber
launch
ini adalah untukasync
launch
danasync
akan memulai coroutine baru. Anda membandingkan coroutine tunggal tanpa anak dengan coroutine tunggal dengan 3 anak. Anda dapat mengganti setiapasync
doa denganlaunch
dan sama sekali tidak ada yang berubah sehubungan dengan konkurensi.kedua pembangun coroutine yaitu launch dan async pada dasarnya adalah lambdas dengan penerima tipe CoroutineScope yang berarti blok bagian dalamnya dikompilasi sebagai fungsi menangguhkan, oleh karena itu mereka berdua berjalan dalam mode asinkron dan mereka berdua akan menjalankan blok mereka secara berurutan.
Perbedaan antara peluncuran dan async adalah mereka memungkinkan dua kemungkinan yang berbeda. Pembuat peluncuran mengembalikan suatu Pekerjaan namun fungsi async akan mengembalikan objek yang Ditangguhkan. Anda dapat menggunakan launch untuk mengeksekusi blok yang tidak Anda harapkan nilai yang dikembalikan darinya yaitu menulis ke database atau menyimpan file atau memproses sesuatu yang pada dasarnya hanya dipanggil untuk efek sampingnya. Di sisi lain, async yang mengembalikan Deferred seperti yang saya nyatakan sebelumnya mengembalikan nilai yang berguna dari eksekusi bloknya, sebuah objek yang membungkus data Anda, sehingga Anda dapat menggunakannya terutama untuk hasilnya tetapi juga untuk efek sampingnya. NB: Anda dapat menghapus yang ditangguhkan dan mendapatkan nilainya menggunakan fungsi menunggu, yang akan memblokir eksekusi laporan Anda sampai nilai dikembalikan atau pengecualian dilemparkan!
pembangun coroutine (launch dan async) dapat dibatalkan.
apa lagi ?: ya dengan peluncuran jika pengecualian dilemparkan di dalam bloknya, coroutine secara otomatis dibatalkan dan pengecualian dikirimkan. Di sisi lain, jika itu terjadi dengan async pengecualian tidak diperbanyak lebih lanjut dan harus ditangkap / ditangani dalam objek yang ditangguhkan yang dikembalikan.
lebih lanjut tentang coroutines https://kotlinlang.org/docs/tutorials/coroutines/coroutines-basic-jvm.html https://www.codementor.io/blog/kotlin-coroutines-6n53p8cbn1
sumber
Peluncuran mengembalikan pekerjaan
async mengembalikan hasil (pekerjaan yang ditangguhkan)
peluncuran dengan bergabung digunakan untuk menunggu sampai pekerjaan selesai. Itu hanya menunda panggilan bergabung coroutine (), meninggalkan utas saat ini bebas untuk melakukan pekerjaan lain (seperti menjalankan coroutine lain) sementara itu.
async digunakan untuk menghitung beberapa hasil. Itu menciptakan coroutine dan mengembalikan hasil masa depannya sebagai implementasi dari Ditangguhkan. Coroutine yang berjalan dibatalkan ketika hasil yang ditangguhkan dibatalkan.
Pertimbangkan metode async yang mengembalikan nilai string. Jika metode async digunakan tanpa menunggu itu akan mengembalikan string yang ditangguhkan tetapi jika menunggu digunakan Anda akan mendapatkan string sebagai hasilnya
Perbedaan utama antara async dan peluncuran. Deferred mengembalikan nilai tipe T tertentu setelah Coroutine Anda selesai dieksekusi, sedangkan Job tidak.
sumber
Async vs Launch Async vs Launch Diff Image
luncurkan / async tidak ada hasil
async untuk hasil
sumber