news

Sabtu, 13 Juni 2020

Belajar Concurrency di Kotlin


Memasuki modul terakhir ini, kita akan mempelajari dasar concurrency pada Kotlin hingga alasan mengapa developer wajib mencoba Kotlin Coroutines

Concurrency merupakan sebuah topik yang cukup dalam. Jika dibahas secara menyeluruh mungkin tidak akan cukup di akademi ini. Maka dari itu, modul ini adalah pengantarnya. 
Diharapkan setelah memahami materi ini, pembaca dapat mengetahui gambaran apa itu concurrency dan perbedaannya pada Kotlin dibandingkan bahasa pemrograman lainnya.

Apa itu Concurrency?

Concurrency adalah beberapa proses yang terjadi secara bersamaan dalam suatu sistem. 
Concurrency merupakan suatu fenomena alami yang umum terjadi. Seperti halnya di dunia nyata, banyak kegiatan yang dilakukan pada waktu yang bersamaan. 
Dengan demikian, ketika kita ingin mengembangkan sebuah sistem untuk membantu kegiatan nyata, tentunya kita harus peduli dengan yang namanya concurrency.
20190429102422dcee0d5cb3bf291b3e9b6766a42a00e9.png

Arus lalu lintas bisa menjadi ilustrasi yang tepat untuk menggambarkan proses concurrency. 
Lalu lintas paralel di jalan yang berbeda hanya akan menimbulkan interaksi dan potensi masalah yang kecil antar kendaraan. Berbeda dengan lalu lintas padat yang biasanya kita jumpai pada persimpangan. 
Pastinya interaksi dan potensi masalah antar kendaraan akan lebih besar dan membutuhkan koordinasi yang lebih. Begitu pula dalam sebuah sistem aplikasi. 
Proses paralel yang tidak saling berinteraksi hanya akan menyebabkan masalah concurrency yang sederhana. Berbeda dengan proses yang saling berinteraksi bahkan berbagi sumber daya. Masalahnya tentu lebih kompleks. 
Penting untuk memperhatikan beberapa aspek saat berurusan dengan concurrency pada semua sistem. Aspek terpenting adalah mampu mendeteksi dan merespon peristiwa eksternal yang terjadi dalam urutan acak. Selain itu juga pastikan bahwa peristiwa tersebut dapat ditanggapi dalam interval waktu minimum yang diwajibkan.
Faktor eksternal sering jadi pendorong dibutuhkannya concurrency. 
Dalam kehidupan sehari-hari, banyak hal yang terjadi secara bersamaan dan harus ditangani secara real-time oleh sistem. Oleh karena itu sistem harus "reactive" alias dituntut untuk menanggapi proses yang dihasilkan secara eksternal. 
Proses tersebut dapat terjadi pada waktu dan urutan yang tak bisa ditentukan. Membangun sistem konvensional untuk mengatasi tugas tersebut, tentunya sangat rumit. 
Di dunia komputer, concurrency umumnya terkait dengan banyaknya core atau inti dari prosesor (CPU). Pada dasarnya, sebuah komputer memiliki mekanisme sequential atau berurutan untuk menjalankan tugas. Prosesor akan menjalankan satu perintah pada satu waktu. 
Dengan concurrency, kita bisa memanfaatkan kinerja prosesor dengan lebih optimal. Concurrency memungkinkan sebuah sistem untuk bisa dikendalikan dengan mudah. Sebagai contoh, suatu fungsi bisa dijalankan, dihentikan, ataupun dipengaruhi oleh fungsi lain yang jalan secara bersamaan

Concurrency vs Parallelism

Jika membahas concurrency, tentunya terkait dengan parallelism. Mungkin ada yang bingung mengenai perbedaan antara keduanya. 
Bagaimanapun, concurrency dan parallelism mempunyai arti yang mirip, yaitu 2 (dua) atau lebih proses yang berjalan pada satu waktu. Namun penting diketahui bahwa concurrency bukanlah parallelism.
Baik concurrency maupun parallelism, biasanya melibatkan pembuatan thread-thread untuk menjalankan tugas. Thread-thread tersebut bisa dijalankan di satu atau lebih core. Lalu apakah perbedaan dari keduanya?
Concurrency terjadi apabila terdapat 2 (dua) atau lebih proses yang tumpang tindih dalam satu waktu. Ini bisa terjadi jika ada 2 (dua) atau lebih thread yang sedang aktif. 
Dan jika thread tersebut dijalankan oleh komputer yang hanya memiliki 1 (satu) core, semua thread tidak akan dijalankan secara paralel. Concurrency memungkinkan sebuah komputer yang hanya memiliki 1 (satu) core tampak seakan mengerjakan banyak tugas sekaligus. Padahal sebenarnya tugas-tugas tersebut dilakukan secara bergantian.
Sedangkan parallelism terjadi ketika 2 (dua) proses dijalankan pada titik waktu yang sama persis. Parallelism bisa dilakukan jika terdapat 2 (dua) atau lebih thread dan komputer juga memiliki 2 (dua) core atau lebih. Sehingga setiap core dapat menjalankan perintah dari masing-masing thread secara bersamaan. 
Perhatikan beberapa ilustrasi berikut agar Anda lebih memahami perbedaan antara concurrency dan parallelism.
201904301035427929db65b1f2975cb30b8bce71a0234c.png

Bayangkan Anda di warung kopi dan melihat antrian seperti yang digambarkan pada ilustrasi di atas. 
Pelanggan dengan masing-masing pesanannya pasti senang jika sang barista bisa melayani dengan tepat dan cepat. Jika pada warung kopi tersebut hanya terdapat seorang barista, otomatis sang barista harus melakukan cara untuk melayani semua pelanggan sekaligus. Pada situasi seperti inilah concurrency dibutuhkan.
20190430104942d5d1552e67b77c9c2e022a3bab7d5cff.png
Karena hanya terdapat seorang barista, maka barista tersebut akan memproses lebih dari satu pesanan secara bersamaan. Hal ini sangat mungkin terjadi karena pembuatan kopi membutuhkan beberapa langkah, dan masing-masing langkah memakan waktu tersendiri. 
Misalnya menyiapkan air panas, menakar kopi, menyiapkan mesin espresso, dll. Barista akan membagi langkah-langkah tersebut sehingga seolah-olah ia bisa mengerjakan pesanan secara bersamaan.
Berbeda jika sang barista punya teman kerja untuk berbagi tugas. Pada situasi ini parallelism bisa dilakukan. Barista 1 hanya akan melayani beberapa pelanggan, dan sisanya akan dilayani oleh barista 2.
20190430105001ed576eb1a3f83e131c24da49381121d2.png
Karena kedua barista tersebut telah berbagi tugas, maka mereka akan bertindak secara paralel sehubungan dengan tugas yang lebih besar dalam melayani pelanggan. 
Bagaimanapun, selama jumlah barista belum sama dengan jumlah pelanggan, concurrency masih tetap diperlukan pada masing-masing barista tersebut. Artinya, parallelism dapat menimbulkan concurrency, tetapi concurrency bisa terjadi tanpa parallelism