Python - Komunikasi Antar-Thred
Halo, penyihir Python masa depan! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia komunikasi antar-thred di Python. Jangan khawatir jika anda baru dalam pemrograman – saya akan menjadi pemandu anda yang mesra, menjelaskan semua langkah demi langkah. Jadi, mari kita wujud!
Apa itu Komunikasi Antar-Thred?
Sebelum kita masuk ke detilnya, mari kita faham apa itu komunikasi antar-thred. Bayangkan anda berada di atas satu tim yang bekerja di atas projek besar. Semua orang bekerja di atas bahagian yang berbeza, tetapi kadang-kadang anda perlu untuk membagi maklumat atau mengkoordinasi usaha anda. Itu adalah yang sama dengan thred di atas program, dan komunikasi antar-thred adalah cara mereka "berbicara" kepada satu sama lain.
Objek Event
Mari kita mula dengan salah satu cara paling mudah untuk thred berkomunikasi: objek Event.
Apa itu Objek Event?
Objek Event adalah seperti bendera yang boleh diatur atau dibersihkan. Thred boleh menunggu bendera ini diatur sebelum meneruskan. Ia adalah seperti menunggu lampu hijau sebelum memintas jalan raya.
Cara Menggunakan Objek Event
Mari kita lihat contoh yang simple:
import threading
import time
def waiter(event):
print("Waiter: Saya menunggu untuk event tersebut diatur...")
event.wait()
print("Waiter: Event telah diatur! Saya boleh meneruskan sekarang.")
def setter(event):
print("Setter: Saya akan menetapkan event dalam 3 saat...")
time.sleep(3)
event.set()
print("Setter: Saya telah menetapkan event!")
# Buat Objek Event
e = threading.Event()
# Buat dan mula thred
t1 = threading.Thread(target=waiter, args=(e,))
t2 = threading.Thread(target=setter, args=(e,))
t1.start()
t2.start()
# Tunggu kedua-dua thred selesai
t1.join()
t2.join()
print("Thred utama: Semua selesai!")
Mari kita kongsi ini:
- Kita import modul
threading
untuk membuat thred dan modultime
untuk menambahkan keterlambatan. - Kita definisikan dua fungsi:
waiter
dansetter
. - Fungsi
waiter
menunggu event diatur menggunakanevent.wait()
. - Fungsi
setter
menunggu 3 saat (meniru beberapa kerja) dan kemudian menetapkan event menggunakanevent.set()
. - Kita buat Objek Event
e
. - Kita buat dua thred, satu untuk setiap fungsi, melepaskan Objek Event kepada kedua-duanya.
- Kita mula kedua-dua thred dan kemudian gunakan
join()
untuk menunggu mereka selesai.
Apabila anda menjalankan ini, anda akan lihat waiter menunggu, kemudian selepas 3 saat, setter menetapkan event, dan waiter meneruskan.
Objek Condition
Sekarang, mari kita naik taraf dan lihat Objek Condition. Ia adalah seperti rakit penyusun Objek Event yang lebih sophistikated.
Apa itu Objek Condition?
Objek Condition membolehkan thred untuk menunggu kondisi tertentu menjadi benar. Ia adalah seperti menunggu orang khusus untuk tiba di atas perayaan sebelum mula permainan.
Cara Menggunakan Objek Condition
Berikut adalah contoh penggunaan Objek Condition:
import threading
import time
import random
# Sumber bersama
items = []
condition = threading.Condition()
def producer():
global items
for i in range(5):
time.sleep(random.random()) # Simulasikan masa produksi yang berbeza
with condition:
items.append(f"Item {i}")
print(f"Producer menambah Item {i}")
condition.notify() # Maklumkan kepada pengguna 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()) # Simulasikan masa konsumsi yang berbeza
# Buat dan mula thred
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
producer_thread.start()
consumer_thread.start()
# Tunggu producer selesai
producer_thread.join()
# Henti consumer (ia berada di atas loop tak berakhir)
consumer_thread.daemon = True
Mari kita kongsi ini:
- Kita buat sumber bersama
items
dan Objek Condition. - Fungsi
producer
menambah item kepada senarai dan memberitahu pengguna. - Fungsi
consumer
menunggu item tersedia, kemudian menghapus dan "mengkonsumsi" mereka. - Kita gunakan
with condition:
untuk mendapatkan dan melepaskan kunci kondisi secara automatik. -
condition.wait()
melepaskan kunci dan menunggu pemberitahuan. -
condition.notify()
bangunkan satu thred yang menunggu.
Contoh ini menunjukkan skenario producer-konsumer klasik, di mana satu thred menghasilkan item dan satu lagi mengkonsumsi mereka.
Perbandingan Objek Event dan Condition
Berikut adalah perbandingan pantas Objek Event dan Condition:
Fitur | Event | Condition |
---|---|---|
Tujuan | Signaling yang simple | Sinkronisasi yang kompleks |
Status | Binari (set/kosongkan) | Boleh memiliki beberapa status |
Menunggu | Thred menunggu event diatur | Thred menunggu kondisi tertentu |
Pemberitahuan | Semua thred yang menunggu diberitahu | Boleh memberitahu satu atau semua thred yang menunggu |
Kasus Penggunaan | Skenario "go/no-go" yang simple | Masalah producer-konsumer, sinkronisasi yang kompleks |
Kesimpulan
Tahniah! Anda baru saja mengambil langkah pertama anda ke atas dunia komunikasi antar-thred di Python. Kita telah membahas Objek Event untuk signaling yang simple dan Objek Condition untuk skenario sinkronisasi yang lebih kompleks.
Ingat, seperti belajar apa jua bahasa baru, latihan membuat perferct. Cuba menulis program anda sendiri menggunakan objek ini. Mungkin membuat sistem chat sederhana di mana thred mewakili pengguna berbeza, atau simulasi sistem lampu lalu lintas menggunakan event.
Komunikasi antar-thred mungkin kelihatan tricky pada permulaan, tetapi dengan masa dan latihan, anda akan mengatur thred seperti maestro yang mengarahkan orkestra. Terus kode, terus belajar, dan yang paling penting, bersenang-senang!
Credits: Image by storyset