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!

Python - Inter-thread Communication

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:

  1. Kita import modul threading untuk membuat thred dan modul time untuk menambahkan keterlambatan.
  2. Kita definisikan dua fungsi: waiter dan setter.
  3. Fungsi waiter menunggu event diatur menggunakan event.wait().
  4. Fungsi setter menunggu 3 saat (meniru beberapa kerja) dan kemudian menetapkan event menggunakan event.set().
  5. Kita buat Objek Event e.
  6. Kita buat dua thred, satu untuk setiap fungsi, melepaskan Objek Event kepada kedua-duanya.
  7. 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:

  1. Kita buat sumber bersama items dan Objek Condition.
  2. Fungsi producer menambah item kepada senarai dan memberitahu pengguna.
  3. Fungsi consumer menunggu item tersedia, kemudian menghapus dan "mengkonsumsi" mereka.
  4. Kita gunakan with condition: untuk mendapatkan dan melepaskan kunci kondisi secara automatik.
  5. condition.wait() melepaskan kunci dan menunggu pemberitahuan.
  6. 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