Python - Multithreading (Bahasa Indonesia)

Halo sobat yang akan menjadi ahli Python! Hari ini, kita akan melakukan perjalanan yang menarik ke dalam dunia multithreading di Python. Jangan khawatir jika kamu masih baru di dunia pemrograman; saya akan menjadi pemandu yang ramah, dan kita akan menjelajahi topik ini langkah demi langkah. Jadi, siapkan wands virtual kamu (papan ketik), dan mari kita melompatlah!

Python - Multithreading

Apa itu Multithreading?

Sebelum kita mulai untuk menggunakan spell dengan thread Python, mari kita mengerti apa itu multithreading. Bayangkan jika kamu adalah seorang chef di dapur yang sibuk. Jika kamu memasak sendiri, kamu hanya bisa melakukan satu tugas pada satu waktu – mengiris sayuran, lalu mengkukus air, lalu menggoreng daging. Tetapi apa jika kamu memiliki beberapa tangan yang bisa melakukan tugas berbeda secara bersamaan? Itulah yang sebenarnya yang dilakukan multithreading untuk program kita!

Multithreading memungkinkan suatu program untuk menjalankan beberapa tugas secara bersamaan di dalam satu proses. Ini seperti memiliki beberapa chef (thread) yang bekerja sama di dapur yang sama (proses) untuk mempersiapkan makanan yang enak (output program) lebih cepat dan lebih efisien.

Perbandingan dengan Proses

Sekarang, kamu mungkin bertanya-tanya, "Tapi pak/guru, saya sudah mendengar tentang proses juga. Bagaimana thread berbeda?" Pertanyaan yang bagus! Mari kita pecahkan:

  1. Penggunaan Sumber Daya: Thread seperti saudara yang berbagi ruangan (ruang memori), sedangkan proses seperti tetangga yang memiliki rumah terpisah. Thread lebih ringan dan berbagi sumber daya, membuatnya lebih efisien untuk tugas tertentu.

  2. Komunikasi: Thread dapat berbicara dengan mudah dengan cara berbagi variabel, tetapi proses perlu menggunakan "telepon" khusus (komunikasi antar-proses) untuk berbicara satu sama lain.

  3. Overhead: Membuat dan mengelola thread biasanya lebih cepat dan memerlukan sumber daya sistem yang lebih sedikit dibandingkan dengan proses.

  4. Kompleksitas: Meskipun thread dapat membuat program kamu lebih cepat, mereka juga memasukkan kompleksitas. Ini seperti mengocok kelereng – menyenangkan dan efisien jika dilakukan dengan benar, tapi kamu mungkin akan menjatuhkan kelereng jika tidak berhati-hati!

Modul Pemilihan Thread di Python

Python, sebagai bahasa yang dermawan, menyediakan beberapa modul untuk bekerja dengan thread. Dua utamanya adalah:

  1. threading: Ini adalah antarmuka tingkat tinggi untuk bekerja dengan thread. Ini seperti murid penyihir yang ramah yang melakukan sebagian besar pekerjaan berat untuk kamu.

  2. _thread: Ini adalah antarmuka tingkat rendah. Ini seperti buku spell kuno – kuat tetapi memerlukan keahlian yang lebih untuk digunakan dengan benar.

Untuk perjalanan magis kita hari ini, kita akan fokus pada modul threading, karena lebih ramah bagi pemula dan lebih banyak digunakan.

Memulai Thread Baru

Baiklah, mari kita melempar spell thread pertamanya! Ini bagaimana kita membuat dan memulai thread baru:

import threading
import time

def cetak_angka():
for i in range(5):
time.sleep(1)
print(f"Thread 1: {i}")

# Membuat thread baru
thread1 = threading.Thread(target=cetak_angka)

# Memulai thread
thread1.start()

# Thread utama terus menjalankan eksekusi
for i in range(5):
time.sleep(1)
print(f"Thread utama: {i}")

# Menunggu thread1 selesai
thread1.join()

print("Semua selesai!")

Mari kita pecahkan incantasi magis ini:

  1. Kita mengimpor modul threading dan time.
  2. Kita mendefinisikan fungsi cetak_angka() yang akan dieksekusi oleh thread kita.
  3. Kita membuat objek thread baru, menentukan fungsi yang harus dijalankan.
  4. Kita memulai thread menggunakan metode start().
  5. Thread utama terus menjalankan loopnya.
  6. Kita menggunakan join() untuk menunggu thread kita selesai sebelum mengakhiri program.

Ketika kamu menjalankan ini, kamu akan melihat angka dari kedua thread yang diinterleaved, menunjukkan eksekusi konkurran!

Sinkronisasi Thread

Sekarang, bayangkan bantuan chef kita mencoba untuk menggunakan pisau yang sama pada saat yang sama – kesusahan, kan? Itulah saat sinkronisasi thread masuk. Kita menggunakan kunci untuk memastikan bahwa hanya satu thread yang dapat mengakses sumber daya yang dibagi pada satu waktu.

Berikut adalah contohnya:

import threading
import time

# Sumber daya yang dibagi
counter = 0
kunci = threading.Lock()

def tambah_counter():
global counter
for _ in range(100000):
kunci.acquire()
counter += 1
kunci.release()

# Membuat dua thread
thread1 = threading.Thread(target=tambah_counter)
thread2 = threading.Thread(target=tambah_counter)

# Memulai thread
thread1.start()
thread2.start()

# Menunggu kedua thread selesai
thread1.join()
thread2.join()

print(f"Nilai counter akhir: {counter}")

Dalam contoh ini, kita menggunakan kunci untuk memastikan bahwa hanya satu thread yang dapat menambah counter pada satu waktu, mencegah kondisi lomba.

Antrian Prioritas Multithread

Terakhir tapi tidak terkecil, mari kita lihat aplikasi praktis dari multithreading – antrian prioritas. Bayangkan ruang rawat darurat rumah sakit di mana pasien diperawatkan berdasarkan tingkat kegawatan kondisinya, bukan hanya waktu kedatangan.

import threading
import queue
import time
import random

# Membuat antrian prioritas
antrian_tugas = queue.PriorityQueue()

def pekerja():
while True:
prioritas, tugas = antrian_tugas.get()
print(f"Memproses tugas: {tugas} (Prioritas: {prioritas})")
time.sleep(random.uniform(0.1, 0.5))  # Simulasikan pekerjaan
antrian_tugas.task_done()

# Membuat dan memulai thread pekerja
for _ in range(3):
thread = threading.Thread(target=pekerja, daemon=True)
thread.start()

# Menambahkan tugas ke antrian
for i in range(10):
prioritas = random.randint(1, 5)
tugas = f"Tugas {i}"
antrian_tugas.put((prioritas, tugas))

# Menunggu semua tugas selesai
antrian_tugas.join()
print("Semua tugas selesai!")

Contoh ini menunjukkan bagaimana beberapa thread dapat bekerja sama untuk memproses tugas dari antrian prioritas secara efisien.

Kesimpulan

Selamat datang, pemrogram Python muda! Kamu baru saja mengambil langkah pertamamu ke dalam realm magis multithreading. Ingat, dengan kekuatan besar datang tanggung jawab besar – gunakan thread dengan bijak, dan mereka akan membuat program kamu lebih cepat dan lebih efisien.

Inilah tabel referensi cepat dari metode threading utama yang telah kita pelajari:

Metode Deskripsi
Thread(target=fungsi) Membuat thread baru untuk menjalankan fungsi yang ditentukan
start() Memulai aktivitas thread
join() Menunggu thread selesai
Lock() Membuat kunci untuk sinkronisasi thread
acquire() Mengambil kunci
release() Mengeluarkan kunci

Terus latihan, tetap curious, dan segera kamu akan mengatur thread seperti seorang maestro Python yang sejati! Selamat coding!

Credits: Image by storyset