Menggunakan Python Multithread

Riris Bayu Asrori
3 min readJan 14, 2025

--

Photo by frank mckenna on Unsplash

Disklaimer: Artikel ini dibantu penulisannya dengan AI untuk memastikan informasi yang akurat dan terstruktur.

Multithreading adalah teknik pemrograman yang memungkinkan program untuk menjalankan beberapa thread (jalur eksekusi) secara bersamaan. Dalam Python, multithreading dapat meningkatkan kinerja aplikasi, terutama untuk tugas IO-bound. Panduan ini memberikan langkah-langkah, tips, dan contoh praktis tentang cara menggunakan threading Python secara efektif.

1. Konsep Dasar Thread

Thread adalah unit terkecil dalam proses yang dapat dijalankan secara independen. Multithreading memungkinkan eksekusi paralel dari beberapa tugas dalam satu proses. Namun, Python memiliki Global Interpreter Lock (GIL) yang dapat membatasi eksekusi paralel penuh pada CPU-bound tasks.

Kapan Menggunakan Multithreading?

  • IO-bound tasks: Misalnya, membaca/mengirim data ke jaringan atau file.
  • Concurrent tasks: Saat beberapa tugas harus dijalankan secara bersamaan, seperti menjalankan server socket dan memproses data pada waktu yang sama.

2. Membuat dan Menjalankan Thread

Modul threading menyediakan cara sederhana untuk membuat thread.

Contoh Dasar

import threading
import time

def print_numbers():
for i in range(5):
print(f"Thread: {threading.current_thread().name} - {i}")
time.sleep(1)
# Membuat thread
thread1 = threading.Thread(target=print_numbers, name="Thread-1")
thread2 = threading.Thread(target=print_numbers, name="Thread-2")
# Menjalankan thread
thread1.start()
thread2.start()
# Menunggu semua thread selesai
thread1.join()
thread2.join()
print("Semua thread selesai.")

Penjelasan

  1. Membuat Thread: Gunakan threading.Thread dengan parameter target yang menunjuk ke fungsi yang akan dijalankan.
  2. Memulai Thread: Panggil metode .start() untuk menjalankan thread.
  3. Menunggu Thread: Gunakan .join() agar program utama menunggu hingga thread selesai.

3. Menggunakan Class untuk Thread

Kita juga dapat membuat subclass dari threading.Thread untuk membuat thread lebih terstruktur.

Contoh

class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name

def run(self):
for i in range(5):
print(f"{self.name}: {i}")
time.sleep(1)
# Membuat instance thread
thread1 = MyThread(name="Worker-1")
thread2 = MyThread(name="Worker-2")
# Menjalankan thread
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("Semua thread selesai.")

4. Sinkronisasi dengan Lock

Ketika beberapa thread mengakses sumber daya bersama, seperti variabel global, kita perlu memastikan bahwa aksesnya terkoordinasi untuk menghindari race condition. Modul threading menyediakan Lock untuk tujuan ini.

Contoh dengan Lock

counter = 0
lock = threading.Lock()

def increment():
global counter
for _ in range(1000):
with lock: # Mengamankan akses ke "counter"
counter += 1
threads = []
for i in range(5):
thread = threading.Thread(target=increment)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
print(f"Nilai akhir counter: {counter}")

Penjelasan

  • Lock: Gunakan with lock untuk mengamankan akses ke sumber daya bersama.
  • Race Condition: Tanpa lock, beberapa thread dapat mengakses dan mengubah data secara bersamaan, menyebabkan hasil yang tidak konsisten.

5. Menggunakan ThreadPoolExecutor

Untuk tugas-tugas sederhana, kita dapat menggunakan concurrent.futures.ThreadPoolExecutor untuk mempermudah pengelolaan thread.

Contoh ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor

def task(n):
print(f"Task {n} dimulai")
time.sleep(2)
print(f"Task {n} selesai")
with ThreadPoolExecutor(max_workers=3) as executor:
for i in range(5):
executor.submit(task, i)
print("Semua tugas selesai.")

Kesimpulan

  • Gunakan multithreading untuk IO-bound tasks.
  • Gunakan threading untuk kontrol lebih besar, atau ThreadPoolExecutor untuk pengelolaan thread yang lebih sederhana.
  • Selalu gunakan Lock atau mekanisme sinkronisasi lainnya saat mengakses sumber daya bersama.

Dengan pemahaman dasar ini, Anda dapat mulai menggunakan multithreading untuk meningkatkan kinerja aplikasi Python Anda.

--

--

Riris Bayu Asrori
Riris Bayu Asrori

No responses yet