Python - Keprihatinan Thread
Helo, pemrogram penyepakat! Hari ini, kita akan melihat ke atas topik yang menarik dalam pengaturcaraan Python: Keprihatinan Thread. Sebagai guru komputer yang mesra di kawasan anda, saya di sini untuk membimbing anda melalui perjalanan ini, langkah demi langkah. Jangan khawatir jika anda baru dalam pengaturcaraan; kita akan mula dari asas dan akan menuju ke atas. Jadi, rakam minuman kegemaran anda, dapatkan keselesaan, dan mari kitaembark pada pengalaman Python ini bersama-sama!
Mengenali Threads dan Keprihatinan
Sebelum kita lompat ke atas perincian mengenai keprihatinan thread, mari kita ambil masa untuk memahami apa itu threads. Bayangkan anda berada di atas dapur yang sibuk, dan anda adalah jurulatih utama. Anda ada banyak tugasan untuk diselesaikan: untuk kunci sayur, mengaduk sup, dan memanggang kue. Buat masa ini, anda menjadikan jurulatih yang berbeza (threads) untuk bekerja pada tugasan ini secara serentak. Itu adalah yang threads lakukan dalam pengaturcaraan – mereka membolehkan program untuk melakukan banyak tugasan secara serentak.
Keprihatinan thread adalah seperti menjadikan tugasan ini penting. Seperti anda mungkin mem prioritaskan untuk mendapatkan hidangan utama sebelum dessert, anda boleh mem prioritaskan thread tertentu dalam program Python anda.
Menetapkan Keprihatinan Thread Menggunakan Sleep()
Satu cara ringkas untuk mengubah keprihatinan thread dalam Python adalah dengan menggunakan fungsi sleep()
. Walaupun kaedah ini tidak secara langsung menetapkan prioritas, ia boleh membantu mengurus masa eksekusi thread yang berbeza.
Mari kita lihat contoh:
import threading
import time
def task(name, sleep_time):
print(f"Tugasan {name} dimulakan")
time.sleep(sleep_time)
print(f"Tugasan {name} diselesaikan")
# Cipta threads
thread1 = threading.Thread(target=task, args=("A", 2))
thread2 = threading.Thread(target=task, args=("B", 1))
# Mula threads
thread1.start()
thread2.start()
# Tunggu untuk threads untuk diselesaikan
thread1.join()
thread2.join()
print("Semua tugasan diselesaikan")
Dalam contoh ini, kita cipta dua thread yang mengeksekusi fungsi task
. Tugasan A tidur untuk 2 saat, sementara Tugasan B tidur untuk 1 saat. Walaupun kita mula Tugasan A dahulu, Tugasan B akan mungkin diselesaikan dahulu kerana masa tidur yang lebih pendek.
Apabila anda jalankan kod ini, anda akan lihat seperti berikut:
Tugasan A dimulakan
Tugasan B dimulakan
Tugasan B diselesaikan
Tugasan A diselesaikan
Semua tugasan diselesaikan
Ini menunjukkan bagaimana kita boleh mengubah urutan dan tempoh eksekusi threads menggunakan sleep()
.
Mengubah Keprihatinan Thread Python di atas Windows
Pada sistem Windows, Python membolehkan kita untuk menetapkan keprihatinan thread lebih secara langsung. Kita boleh menggunakan modul win32process
dari pakej pywin32
untuk mengubah keprihatinan thread.
Pertama, anda perlu untuk memasang pywin32
:
pip install pywin32
Sekarang, mari kita lihat contoh:
import threading
import time
import win32api
import win32process
import win32con
def set_thread_priority(priority):
handle = win32api.GetCurrentThread()
win32process.SetThreadPriority(handle, priority)
def task(name, priority):
set_thread_priority(priority)
print(f"Tugasan {name} dimulakan dengan prioritas {priority}")
time.sleep(2)
print(f"Tugasan {name} diselesaikan")
# Cipta threads
thread1 = threading.Thread(target=task, args=("A", win32process.THREAD_PRIORITY_BELOW_NORMAL))
thread2 = threading.Thread(target=task, args=("B", win32process.THREAD_PRIORITY_ABOVE_NORMAL))
# Mula threads
thread1.start()
thread2.start()
# Tunggu untuk threads untuk diselesaikan
thread1.join()
thread2.join()
print("Semua tugasan diselesaikan")
Dalam contoh ini, kita menetapkan Tugasan A untuk memiliki prioritas di bawah normal dan Tugasan B untuk memiliki prioritas di atas normal. Sistem operasi Windows akan cuba untuk mengalokasikan lebih masa CPU kepada Tugasan B, potentially causing it to complete faster.
Mengprioritaskan Thread Python Menggunakan Modul Queue
Satu lagi cara untuk mengurus keprihatinan thread adalah dengan menggunakan modul Queue
Python. Walaupun ia tidak secara langsung menetapkan prioritas, ia membolehkan kita untuk mengawal urutan di mana tugasan diproses.
Mari kita lihat contoh:
import threading
import queue
import time
def worker(q, name):
while True:
task = q.get()
if task is None:
break
print(f"Worker {name} memproses tugasan: {task}")
time.sleep(1)
q.task_done()
# Cipta satu queue prioritas
q = queue.PriorityQueue()
# Tambah tugasan ke atas queue (nombor lebih rendah = prioritas lebih tinggi)
q.put((2, "Tugasan prioritas rendah"))
q.put((1, "Tugasan prioritas tinggi"))
q.put((3, "Tugasan prioritas最低"))
# Cipta dan mula threads pekerja
threads = []
for i in range(2):
t = threading.Thread(target=worker, args=(q, i))
t.start()
threads.append(t)
# Tunggu untuk semua tugasan untuk diselesaikan
q.join()
# Henti pekerja
for i in range(2):
q.put(None)
for t in threads:
t.join()
print("Semua tugasan diselesaikan")
Dalam contoh ini, kita menggunakan PriorityQueue
untuk mengurus tugasan. Tugasan dengan nombor lebih rendah diproses terlebih dahulu. Ini membolehkan kita untuk mem prioritaskan beberapa tugasan di atas yang lain.
Penutup
Dan itu adalah, pelajar penyepakat saya! Kita telah menjelajahi tiga cara berbeza untuk mengurus keprihatinan thread dalam Python. Ingat, seperti dapur yang diorchestrate dengan baik, pengurusan keprihatinan thread membantu program anda dijalankan lebih efisien.
Berikut adalah ringkasan cepat mengenai kaedah yang kita telah cuba:
Kaedah | Kelebihan | Kelemahan |
---|---|---|
Menggunakan sleep() | Mudah untuk melaksanakan | Tidak secara langsung menetapkan prioritas |
Prioritas khusus Windows | Kawalan langsung atas keprihatinan thread | Hanya berfungsi di atas sistem Windows |
Modul Queue | Berfungsi di atas semua sistem, membolehkan kawalan halus | Memerlukan implementasi yang lebih kompleks |
Sebagai anda teruskan perjalanan Python anda, anda akan temui bahwa pemahaman keprihatinan thread boleh sangat berguna untuk mengoptimumkan program anda. Teruskan untuk berlatih, tetap penyepakat, dan jangan takut untuk untuk eksperimen. Selamat pengaturcaraan!
Credits: Image by storyset