Coroutine Channel - Flow Coroutine - Suspending Function Coroutine
Pada pertemuan kali ini kita akan belajar mengenai Coroutine Channel, Flow Coroutine, Suspending Function Coroutine ketiga ini merupakan beberapa konsep terkait korutin yang berguna dalam pemrograman konkuren atau asinkronus, untuk lebih jelasnya mari kita bahas secara detail dari ketiga tersebut :
1. Coroutine Channel
Coroutine Channel adalah struktur data yang dapat digunakan untuk komunikasi antar korutin. Channel berfungsi sebagai saluran yang dapat digunakan untuk mengirim dan menerima data secara asinkron antara korutin-korutin yang berjalan secara konkuren. Channel menyediakan operasi pengiriman data yang aman dan operasi penerimaan data yang dapat dijeda hingga data tersedia. Contoh penggunaan Coroutine Channel:
Output;
Penjelasan dari penggalan kode yaitu, mengilustrasikan penggunaan Coroutine Channel dalam Kotlin. Channel digunakan untuk mengirim dan menerima data secara asinkron antara korutin-korutin yang berjalan secara konkuren. Pada kode tersebut, kita membuat sebuah Channel dengan tipe data Int menggunakan Channel<Int>(). Pada korutin pertama, kita menggunakan loop for untuk mengirimkan angka 1 hingga 5 ke dalam channel menggunakan channel.send(i). Setelah itu, kita menutup channel menggunakan channel.close() untuk menandakan bahwa tidak ada lagi data yang akan dikirim. Pada korutin kedua, kita menggunakan loop for untuk mengambil (receive) data dari channel menggunakan for (item in channel). Setiap item yang diterima dari channel dicetak sebagai output.
2. Flow Coroutine
Flow Coroutine adalah konsep yang memungkinkan pemrograman asinkronus dengan menggunakan aliran (stream) data yang dapat dihasilkan secara berkelanjutan. Flow mirip dengan Stream atau Observable di konsep pemrograman reaktif. Flow memungkinkan transformasi data berkelanjutan, operasi antara, dan penanganan kesalahan yang terstruktur. Contoh penggunaan Flow Coroutine:
Output ;
Pada penggalan kode tersebut dapat di jelaskan bahwa kita telah mengilustrasikan penggunaan Flow Coroutine dalam Kotlin. Flow digunakan untuk mengelola aliran data berkelanjutan (streaming) yang dapat dihasilkan secara berkelanjutan. Serta pada kode tersebut, kita menggunakan flow builder untuk membuat Flow. Di dalam Flow, kita melakukan iterasi dari 1 hingga 5 menggunakan loop for dan menggunakan delay(100) untuk menunda emit data selama 100 milidetik. Setiap nilai dihasilkan (emit) menggunakan emit(i) pada Flow. Pada blok flow.collect, kita mengumpulkan (collect) data yang diterima dari Flow dan mencetaknya sebagai output.
3. Suspending Function Coroutine
Suspending Function Coroutine adalah fungsi yang dapat menjeda (suspend) eksekusinya tanpa memblokir thread yang sedang digunakan. Fungsi suspending dapat dipanggil dari korutin atau fungsi lain yang bersifat suspending. Fungsi suspending biasanya digunakan untuk menjalankan operasi yang membutuhkan waktu lama seperti I/O, penundaan, atau pemanggilan jaringan. Contoh penggunaan Suspending Function Coroutine:
Output ;
Kode tersebut mengilustrasikan penggunaan Suspending Function Coroutine dalam Kotlin. Suspending Function adalah fungsi yang dapat menjeda (suspend) eksekusinya tanpa memblokir thread. Pada kode tersebut, kita mendefinisikan fungsi suspending doSomeWork yang menggunakan delay(1000) untuk menjeda eksekusi selama 1 detik. Di dalam blok main, kita meluncurkan (launch) sebuah korutin dan memanggil fungsi suspending doSomeWork. Ketika fungsi doSomeWork dijalankan, eksekusi korutin akan menjeda selama 1 detik menggunakan delay, kemudian mencetak pesan "Work done!". Setelah itu, pesan "Work completed!" dicetak setelah korutin selesai menjalankan fungsi suspending.
Dengan demikisn dapat disimpulkan bahwa, Coroutine Channel, Flow Coroutine, dan Suspending Function Coroutine adalah konsep yang digunakan dalam pemrograman konkuren atau asinkronus dengan menggunakan korutin pada Kotlin. Coroutine Channel digunakan untuk komunikasi antar korutin, Flow Coroutine digunakan untuk mengelola aliran data berkelanjutan, dan Suspending Function Coroutine digunakan untuk menjalankan operasi yang membutuhkan waktu lama tanpa memblokir thread.