Python - Komunikasi Antar-Thred

Halo, para ahli Python masa depan! Hari ini, kita akan memulai perjalanan yang menarik ke dunia komunikasi antar-thred di Python. Jangan khawatir jika Anda masih baru di bidang pemrograman – saya akan menjadi pemandu yang ramah, menjelaskan semuanya langkah demi langkah. Jadi, mari kita melompat!

Python - Inter-thread Communication

Apa itu Komunikasi Antar-Thred?

Sebelum kita masuk ke detail, mari kita mengerti apa itu komunikasi antar-thred. Bayangkan Anda berada di tim yang bekerja pada proyek besar. Semua orang bekerja pada bagian yang berbeda, tetapi kadang-kadang Anda perlu berbagi informasi atau mengkoordinasikan upaya Anda. Itu yang benar-benar dilakukan oleh thred di dalam program, dan komunikasi antar-thred adalah cara mereka "berbicara" satu sama lain.

Objek Event

Mari kita mulai dengan salah satu cara termudah thred bisa berkomunikasi: objek Event.

Apa itu Objek Event?

Objek Event seperti bendera yang bisa diatur atau dibersihkan. Thred bisa menunggu bendera ini diatur sebelum melanjutkan. Ini mirip seperti menunggu lampu hijau sebelum melewati jalan.

Cara Menggunakan Objek Event

Mari kita lihat contoh sederhana:

import threading
import time

def waiter(event):
print("Waiter: Saya menunggu event diatur...")
event.wait()
print("Waiter: Event sudah diatur! Saya bisa melanjutkan sekarang.")

def setter(event):
print("Setter: Saya akan mengatur event dalam 3 detik...")
time.sleep(3)
event.set()
print("Setter: Saya sudah mengatur event!")

# Membuat objek Event
e = threading.Event()

# Membuat dan menjalankan thred
t1 = threading.Thread(target=waiter, args=(e,))
t2 = threading.Thread(target=setter, args=(e,))

t1.start()
t2.start()

# Menunggu kedua thred selesai
t1.join()
t2.join()

print("Thred utama: Semua selesai!")

Mari kita pecahkan:

  1. Kita mengimpor modul threading untuk membuat thred dan modul time untuk menambahkan jeda.
  2. Kita mendefinisikan dua fungsi: waiter dan setter.
  3. Fungsi waiter menunggu event diatur menggunakan event.wait().
  4. Fungsi setter menunggu 3 detik (mengsimulasikan beberapa pekerjaan) lalu mengatur event menggunakan event.set().
  5. Kita membuat objek Event e.
  6. Kita membuat dua thred, satu untuk setiap fungsi, melewatkan objek Event ke kedua-duanya.
  7. Kita menjalankan kedua thred lalu menggunakan join() untuk menunggu mereka selesai.

Ketika Anda menjalankan ini, Anda akan melihat waiter menunggu, lalu setelah 3 detik, setter mengatur event, dan waiter melanjutkan.

Objek Kondisi

Sekarang, mari kita naik level dan lihat objek Kondisi. Ini seperti sepupu objek Event yang lebih Sophisticated.

Apa itu Objek Kondisi?

Objek Kondisi memungkinkan thred untuk menunggu kondisi tertentu menjadi benar. Ini mirip seperti menunggu seseorang tertentu untuk datang ke pesta sebelum memulai permainan.

Cara Menggunakan Objek Kondisi

Berikut adalah contoh penggunaan Objek Kondisi:

import threading
import time
import random

# Sumber daya bersama
items = []
condition = threading.Condition()

def producer():
global items
for i in range(5):
time.sleep(random.random())  # Mengsimulasikan waktu produksi yang beragam
with condition:
items.append(f"Item {i}")
print(f"Producer menambahkan Item {i}")
condition.notify()  # Memberi tahu konsumen bahwa item tersedia

def consumer():
global items
while True:
with condition:
while not items:
print("Consumer sedang menunggu...")
condition.wait()
item = items.pop(0)
print(f"Consumer menghapus {item}")
time.sleep(random.random())  # Mengsimulasikan waktu konsumsi yang beragam

# Membuat dan menjalankan thred
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)

producer_thread.start()
consumer_thread.start()

# Menunggu produser selesai
producer_thread.join()

# Menghentikan konsumen (itu berada di loop tak terbatas)
consumer_thread.daemon = True

Mari kita pecahkan:

  1. Kita membuat sumber daya bersama items dan objek Kondisi.
  2. Fungsi producer menambahkan item ke daftar dan memberi tahu konsumen.
  3. Fungsi consumer menunggu item tersedia, lalu menghapus dan "mengkonsumsi" mereka.
  4. Kita menggunakan with condition: untuk mengakuisisi dan melepaskan kunci kondisi secara otomatis.
  5. condition.wait() melepaskan kunci dan menunggu notifikasi.
  6. condition.notify() membangunkan satu thred yang menunggu.

Contoh ini menunjukkan skenario produser-konsumen klasik, di mana satu thred menghasilkan item dan yang lain mengkonsumsinya.

Perbandingan Objek Event dan Kondisi

Berikut adalah perbandingan cepat antara Objek Event dan Kondisi:

Fitur Event Kondisi
Tujuan Signaling sederhana Sinkronisasi kompleks
Status Binari (set/dibersihkan) Dapat memiliki banyak status
Menunggu Thred menunggu event diatur Thred menunggu kondisi tertentu
Notifikasi Semua thred yang menunggu dihapus Dapat menghapus satu atau semua thred yang menunggu
kasus Penggunaan Skenario "go/no-go" sederhana Masalah produser-konsumen, sinkronisasi kompleks

Kesimpulan

Selamat! Anda baru saja mengambil langkah pertama Anda ke dunia komunikasi antar-thred di Python. Kita telah membahas objek Event untuk signaling sederhana dan objek Kondisi untuk skenario sinkronisasi yang lebih kompleks.

Ingat, seperti belajar semua bahasa baru, praktek membuat perfect. Cobalah menulis program Anda sendiri menggunakan objek ini. Mungkin Anda bisa membuat sistem obrolan sederhana di mana thred mewakili pengguna berbeda, atau mengsimulasikan sistem lampu lalu lintas menggunakan event.

Komunikasi antar-thred mungkin tampak sulit pada awalnya, tetapi dengan waktu dan praktek, Anda akan menjadi orkestrator thred seperti maestro yang mengatur orkestra. Tetap coding, tetap belajar, dan yang paling penting, nikmati waktu Anda!

Credits: Image by storyset