Memahami Konsep Synchronous, Asynchronous, Concurrency, Multithreading dan Parallel
Intro
Pemrograman modern semakin kompleks seiring dengan kebutuhan akan performa yang lebih tinggi dan efisiensi yang lebih baik. Salah satu aspek penting dalam pemrograman adalah bagaimana kita mengelola tugas dan eksekusi kode, terutama dalam konteks sistem yang membutuhkan responsivitas tinggi, pemrosesan data besar, atau interaksi real-time. Dalam artikel ini, kita akan membahas secara mendetail tentang konsep Synchronous, Concurrency, Multithreading, Parallel, dan Asynchronous. Selain itu, kita juga akan membahas konsep tambahan seperti Event-Driven dan Reactive Programming yang sering berkaitan dengan topik ini.
Sebelum kita masuk ke dalam masing-masing konsep, penting untuk memahami mengapa konsep-konsep ini relevan dan bagaimana mereka berhubungan satu sama lain. Pada dasarnya, semua konsep ini berkaitan dengan bagaimana tugas dieksekusi dalam suatu program. Pengelolaan eksekusi ini sangat penting dalam berbagai aplikasi, dari server web yang harus menangani ribuan permintaan secara bersamaan hingga aplikasi desktop yang membutuhkan antarmuka pengguna yang responsif.|
Synchronous vs Asynchronous
Synchronous
Dalam pemrograman synchronous, tugas dieksekusi satu per satu. Setiap tugas harus selesai sebelum tugas berikutnya dimulai. Pendekatan ini sederhana dan mudah dipahami, tetapi dapat menyebabkan kinerja yang buruk jika ada tugas yang memakan waktu lama.
Contoh sederhana dalam JavaScript:
function task1() {
console.log(“Task 1”);
}
function task2() {
console.log("Task 2");
}
task1();
task2();
Pada contoh di atas, task2
tidak akan dieksekusi sampai task1
selesai.
Asynchronous
Dalam pemrograman asynchronous, tugas dapat dieksekusi secara bersamaan atau tidak tergantung satu sama lain. Hal ini memungkinkan program untuk tetap responsif dan efisien.
Contoh sederhana dalam JavaScript menggunakan callback:
function task1(callback) {
setTimeout(() => {
console.log("Task 1");
callback();
}, 1000);
}
function task2() {
console.log("Task 2");
}
task1(task2);
Pada contoh di atas, task2
akan dieksekusi setelah task1
selesai, tetapi task1
tidak memblokir eksekusi lainnya selama menunggu.
Concurrency
Concurrency berarti bahwa beberapa tugas membuat kemajuan selama periode waktu yang sama. Concurrency tidak selalu berarti bahwa tugas dieksekusi secara paralel. Sebaliknya, mereka mungkin bergantian dalam menggunakan sumber daya.
Contoh dalam Python menggunakan concurrent.futures
:
package main
import (
"fmt"
"time"
)
func task(name string) {
fmt.Printf("Task %s starting\n", name)
time.Sleep(2 * time.Second)
fmt.Printf("Task %s completed\n", name)
}
func main() {
for i := 1; i <= 5; i++ {
go task(fmt.Sprintf("Task %d", i))
}
// Wait for all goroutines to finish
time.Sleep(5 * time.Second)
}
Pada contoh ini, beberapa tugas dijalankan secara concurrent menggunakan goroutines.
Multithreading
Multithreading adalah salah satu cara untuk mencapai concurrency dengan menggunakan multiple threads dalam satu proses. Setiap thread dapat menjalankan tugas secara independent, tetapi mereka berbagi memori yang sama.
Contoh dalam Java:
public class MultiThreadDemo extends Thread {
private String threadName;
MultiThreadDemo(String name) {
threadName = name;
}
public void run() {
System.out.println(threadName + " starting.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(threadName + " interrupted.");
}
System.out.println(threadName + " completed.");
}
public static void main(String[] args) {
MultiThreadDemo thread1 = new MultiThreadDemo("Thread 1");
MultiThreadDemo thread2 = new MultiThreadDemo("Thread 2");
thread1.start();
thread2.start();
}
}
Dalam contoh ini, dua thread dijalankan secara bersamaan.
Parallel
Parallel execution berarti bahwa tugas-tugas dijalankan secara bersamaan, benar-benar simultan, biasanya pada multiple processors atau cores. Ini adalah subset dari concurrency di mana eksekusi benar-benar terjadi pada saat yang sama.
Contoh dalam Python menggunakan multiprocessing
:
import multiprocessing
import time
def task(name):
print(f"Task {name} starting")
time.sleep(2)
print(f"Task {name} completed")
if __name__ == "__main__":
processes = []
for i in range(5):
p = multiprocessing.Process(target=task, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()py
Dalam contoh ini, beberapa proses dijalankan secara paralel menggunakan multiple processors.
Event-Driven
Pemrograman berbasis peristiwa (event-driven) adalah paradigma di mana alur program ditentukan oleh peristiwa, seperti tindakan pengguna, sensor output, atau pesan dari program lain.
Contoh dalam JavaScript:
document.getElementById("myButton").addEventListener("click", function() {
console.log("Button was clicked!");
});
Di sini, console.log
akan dipanggil setiap kali tombol diklik.
Reactive Programming
Reactive Programming adalah paradigma pemrograman deklaratif yang berkaitan dengan aliran data dan propagasi perubahan. Ini sangat berguna untuk membangun sistem asynchronous yang responsif.
Contoh dalam Java menggunakan RxJava:
import io.reactivex.Observable;
public class ReactiveDemo {
public static void main(String[] args) {
Observable<String> observable = Observable.just("Hello", "Reactive", "World");
observable.subscribe(System.out::println);
}
}
Kesimpulan
Mengelola eksekusi tugas dalam pemrograman modern melibatkan pemahaman berbagai konsep seperti Synchronous, Asynchronous, Concurrency, Multithreading, Parallel, Event-Driven, dan Reactive Programming. Masing-masing konsep ini memiliki keunggulan dan penggunaan yang spesifik tergantung pada kebutuhan aplikasi yang sedang dibangun. Dengan memahami dan menerapkan konsep-konsep ini dengan tepat, kita dapat membangun sistem yang lebih efisien, responsif, dan dapat diskalakan.