
Di era komputasi modern, kebutuhan akan performa tinggi dan efisiensi waktu menjadi sangat penting. Salah satu pendekatan untuk meningkatkan kecepatan eksekusi program adalah melalui pemrograman paralel dan concurrency. Keduanya merupakan teknik yang digunakan untuk mengeksekusi banyak tugas secara bersamaan, tetapi memiliki perbedaan mendasar dalam pendekatannya. Dalam bahasa Python, kedua konsep ini bisa diimplementasikan dengan cukup fleksibel meskipun ada keterbatasan seperti Global Interpreter Lock (GIL).
Python, yang dikenal sebagai bahasa pemrograman dengan sintaks sederhana dan komunitas besar, tetap relevan dalam dunia high-performance computing berkat dukungan pustaka seperti threading, multiprocessing, dan asyncio. Tapi, bagaimana sebenarnya Python menangani concurrency dan paralelisme? Mari kita bahas dengan pendekatan yang mudah dipahami.
Concurrency: Menjalankan Banyak Tugas Secara Bergiliran
Concurrency adalah kemampuan untuk menangani beberapa tugas sekaligus, tetapi tidak selalu menjalankannya pada waktu yang sama. Bayangkan Anda sedang memasak nasi dan sambil menunggu matang, Anda menyiapkan sayuran. Kedua pekerjaan terjadi dalam waktu yang sama secara logis, meskipun dilakukan satu per satu secara fisik.
Dalam Python, concurrency bisa dilakukan dengan menggunakan threading dan asyncio. Misalnya, pustaka threading memungkinkan kita membuat thread yang masing-masing bisa menjalankan fungsi berbeda. Tapi karena GIL, hanya satu thread yang bisa berjalan dalam satu waktu CPU, jadi ini tidak benar-benar paralel.
Contoh sederhana dengan threading:
pythonimport threading
def print_numbers():
for i in range(5):
print(f"Number: {i}")
def print_letters():
for c in ['A', 'B', 'C', 'D', 'E']:
print(f"Letter: {c}")
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)
t1.start()
t2.start()
t1.join()
t2.join()
Output dari kode ini akan saling bercampur antara angka dan huruf, menunjukkan concurrency meski tidak benar-benar paralel secara fisik.
Jika ingin efisiensi yang lebih tinggi dalam aplikasi I/O-bound, asyncio menjadi solusi yang sangat efektif. Dengan asyncio, kita bisa membuat coroutine — fungsi khusus yang bisa “tidur” saat menunggu (misalnya saat akses jaringan) dan memberikan giliran kepada coroutine lain.
Pemrograman Paralel: Eksekusi Tugas di Banyak Prosesor
Berbeda dengan concurrency, paralelisme melibatkan eksekusi tugas secara simultan, biasanya pada beberapa core CPU. Ini seperti Anda dan teman Anda masing-masing mengerjakan satu resep masakan berbeda secara bersamaan — benar-benar paralel.
Python mengatasi keterbatasan GIL dengan menggunakan modul multiprocessing. Modul ini menjalankan proses-proses berbeda yang tidak terikat oleh GIL, sehingga benar-benar dapat berjalan secara paralel pada multi-core CPU.
Contoh paralelisme dengan multiprocessing:
pythonfrom multiprocessing import Process
def compute_square(number):
print(f"Square: {number ** 2}")
if __name__ == "__main__":
numbers = [2, 3, 4, 5]
processes = []
for num in numbers:
p = Process(target=compute_square, args=(num,))
processes.append(p)
p.start()
for p in processes:
p.join()
Setiap proses akan berjalan secara independen, memanfaatkan core CPU yang berbeda. Teknik ini sangat berguna untuk tugas-tugas CPU-bound seperti pemrosesan data besar, enkripsi, atau pengolahan gambar.
Kapan Menggunakan Concurrency vs Paralelisme?
Pemilihan antara concurrency dan paralelisme tergantung pada jenis tugas:
- Gunakan concurrency (threading atau asyncio) jika program Anda banyak berurusan dengan I/O-bound tasks seperti pengambilan data dari internet, operasi file, atau interaksi dengan database.
- Gunakan paralelisme (multiprocessing) jika Anda ingin mempercepat eksekusi CPU-bound tasks seperti perhitungan numerik besar atau proses yang berat secara komputasi.
Menariknya, dalam pengembangan aplikasi modern, kombinasi keduanya juga bisa diterapkan. Misalnya, menjalankan banyak proses paralel yang di dalamnya menggunakan concurrency untuk menangani I/O secara efisien.
Python Tetap Andal untuk Multitasking
Walaupun Python memiliki keterbatasan karena GIL, bahasa ini tetap andal untuk pemrograman paralel dan concurrency dengan pendekatan yang tepat. Melalui threading dan asyncio, developer bisa mengelola banyak tugas secara bersamaan. Sementara itu, multiprocessing memungkinkan eksekusi paralel sejati pada mesin multi-core.
Pemahaman yang baik tentang kebutuhan aplikasi Anda akan membantu memilih pendekatan yang paling efisien. Dengan terus berkembangnya pustaka dan teknik implementasi, Python tetap menjadi pilihan kuat untuk membangun aplikasi yang responsif dan cepat.
BACA JUGA : Teknik Code Review Efektif untuk Pengembang Tim Kecil