Python - Penyelarasan Thread

Helo di sana, ahli penyihir Python masa depan! Hari ini, kita akan melakukan perjalanan yang menarik ke atas dunia penyelarasan thread. Bayangkan anda sebagai seorang penyelenggara orkestra di mana setiap ahli orkestra adalah sebuah thread, dan anda perlu memastikan mereka semua untuk bermain dengan harmoni. Itu adalah esen penyelarasan thread di atas pemrograman!

Python - Synchronizing Threads

Penyelarasan Thread menggunakan Kunci

Mari kita mula dengan alat paling asas dalam rak penyelarasan kami: kunci. Pandang kunci sebagai tanda "jangan ganggu" di atas pintu rakaman di hotel. Apabila sebuah thread mengambil kunci, itu seperti meletakkan tanda itu, memberitahu thread lain, "Hai, saya sibuk di sini!"

Berikut adalah contoh yang ringkas untuk melukiskan konsep ini:

import threading
import time

# Sumber bersama
counter = 0

# Buat satu kunci
lock = threading.Lock()

def increment():
global counter
for _ in range(100000):
lock.acquire()
counter += 1
lock.release()

# Buat dua thread
thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=increment)

# Mula thread
thread1.start()
thread2.start()

# Tunggu thread untuk selesai
thread1.join()
thread2.join()

print(f"Nilai counter akhir: {counter}")

Dalam contoh ini, kita ada sumber bersama counter yang dua thread cuba untuk meningkatkan. Tanpa kunci, kita mungkin mendapat penyebab keadaan lomba, di mana kedua-dua thread cuba untuk meningkatkan counter secara bersamaan, yang boleh membawa kepada hasil yang salah.

Dengan menggunakan lock.acquire() sebelum mengubah counter dan lock.release() selepas itu, kita pastikan hanya satu thread yang boleh meningkatkan counter pada satu masa. Itu seperti melempar rakitan di atas rakit penyertaan – hanya thread yang menggenggam rakitan (kunci) yang boleh lari (ubah sumber bersama).

Objek Kondisi untuk Penyelarasan Thread Python

Sekarang, mari tingkatkan permainan penyelarasan kami dengan Objek Kondisi. Ini adalah seperti lampu isyarat yang terkini untuk thread kita, membenarkan koordinasi yang lebih kompleks.

Berikut adalah contoh skenario pembuat-pengguna menggunakan Objek Kondisi:

import threading
import time
import random

# Penyangga bersama
buffer = []
MAX_SIZE = 5

# Buat satu objek kondisi
condition = threading.Condition()

def producer():
global buffer
while True:
with condition:
while len(buffer) == MAX_SIZE:
print("Penyangga penuh, pembuat menunggu...")
condition.wait()
item = random.randint(1, 100)
buffer.append(item)
print(f"Dibuat: {item}")
condition.notify()
time.sleep(random.random())

def consumer():
global buffer
while True:
with condition:
while len(buffer) == 0:
print("Penyangga kosong, pengguna menunggu...")
condition.wait()
item = buffer.pop(0)
print(f"Dikonsumsi: {item}")
condition.notify()
time.sleep(random.random())

# Buat thread pembuat dan pengguna
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)

# Mula thread
producer_thread.start()
consumer_thread.start()

# Biarkan ia berjalan untuk sesaat
time.sleep(10)

Dalam contoh ini, kita ada pembuat yang menambah item ke penyangga dan pengguna yang mengeluarkan item darinya. Objek Kondisi membantu mengkoordinasi tindakan mereka:

  • Pembuat menunggu apabila penyangga penuh.
  • Pengguna menunggu apabila penyangga kosong.
  • Mereka memberitahu satu sama lain apabila ia adalah aman untuk maju.

Itu seperti tarian yang di penyusun dengan baik, dengan Objek Kondisi sebagai penyusun!

Penyelarasan thread menggunakan metode join()

Metode join() adalah seperti memberitahu satu thread untuk menunggu thread lain untuk selesaikan persembahan sebelum mengambil rakam. Ini adalah cara yang ringkas tetapi kuat untuk penyelarasan thread.

Berikut adalah contoh:

import threading
import time

def worker(name, delay):
print(f"{name} mula...")
time.sleep(delay)
print(f"{name} selesai!")

# Buat thread
thread1 = threading.Thread(target=worker, args=("Thread 1", 2))
thread2 = threading.Thread(target=worker, args=("Thread 2", 4))

# Mula thread
thread1.start()
thread2.start()

# Tunggu thread1 untuk selesai
thread1.join()
print("Thread utama menunggu selepas thread1")

# Tunggu thread2 untuk selesai
thread2.join()
print("Thread utama menunggu selepas thread2")

print("Semua thread telah selesai!")

Dalam contoh ini, thread utama mula dua thread pekerja dan kemudian menunggu setiap untuk selesai menggunakan join(). Itu adalah seperti ibu menunggu anak mereka untuk selesaikan kerja sekolah sebelum menyediakan makan malam!

Primitif Penyelarasan Tambahan

Python menawarkan beberapa alat lain untuk penyelarasan thread. Mari lihat beberapa contohnya secara cepat:

Primitif Keterangan Kasus Penggunaan
Semaphore Membenarkan beberapa thread untuk mengakses sumber Mengurus rakaman sambungan pangkalan data
Event Membenarkan satu thread untuk memberitahu peristiwa kepada thread lain Mengisyaratkan bahawa tugas telah selesai
Barrier Membenarkan beberapa thread untuk menunggu sehingga semua mencapai titik tertentu Penyelarasan mula rakit penyertaan

Berikut adalah contoh yang cepat menggunakan Semaphore:

import threading
import time

# Buat semaphore yang membenarkan 2 thread pada satu masa
semaphore = threading.Semaphore(2)

def worker(name):
with semaphore:
print(f"{name} mengambil semaphore")
time.sleep(1)
print(f"{name} melepaskan semaphore")

# Buat dan mula 5 thread
threads = []
for i in range(5):
thread = threading.Thread(target=worker, args=(f"Thread {i}",))
threads.append(thread)
thread.start()

# Tunggu semua thread untuk selesai
for thread in threads:
thread.join()

print("Semua thread telah selesai!")

Dalam contoh ini, semaphore bertindak seperti penyelia di atas klub, hanya membenarkan dua thread untuk masuk pada satu masa. Ini adalah sempurna untuk situasi di mana anda perlu untuk membatasi akses ke sumber yang kritis!

Dan itu untuk semua, rakan-rakan! Kita telah menjelajahi dunia penyelarasan thread yang menarik di atas Python. Ingat, seperti penyelenggara orkestra atau penyusun tarian, penyelarasan thread adalah semua tentang koordinasi dan waktu. Dengan alat ini di atas rak pemrograman anda, anda sudah di atas jalan untuk membuat program Python berthread yang harmoni. Teruskan untuk berlatih, tetap curious, dan happy coding!

Credits: Image by storyset