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!
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:
- Kita mengimpor modul
threading
untuk membuat thred dan modultime
untuk menambahkan jeda. - Kita mendefinisikan dua fungsi:
waiter
dansetter
. - Fungsi
waiter
menunggu event diatur menggunakanevent.wait()
. - Fungsi
setter
menunggu 3 detik (mengsimulasikan beberapa pekerjaan) lalu mengatur event menggunakanevent.set()
. - Kita membuat objek Event
e
. - Kita membuat dua thred, satu untuk setiap fungsi, melewatkan objek Event ke kedua-duanya.
- 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:
- Kita membuat sumber daya bersama
items
dan objek Kondisi. - Fungsi
producer
menambahkan item ke daftar dan memberi tahu konsumen. - Fungsi
consumer
menunggu item tersedia, lalu menghapus dan "mengkonsumsi" mereka. - Kita menggunakan
with condition:
untuk mengakuisisi dan melepaskan kunci kondisi secara otomatis. -
condition.wait()
melepaskan kunci dan menunggu notifikasi. -
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