برنامه نویسی چند نخی (Multithreading) در پایتون

مقدمه
برنامهنویسی Multithreading یکی از مفاهیم مهم در توسعه نرمافزار است که به برنامهها اجازه میدهد چندین کار را به صورت همزمان انجام دهند. در پایتون، ماژول threading
این امکان را فراهم میکند تا بتوانید Thread (رشته) ایجاد کنید و از مزایای Multithreading بهرهمند شوید. در این مقاله، به طور کامل با Multithreading در پایتون آشنا میشویم و در پایان یک مثال کاربردی ارائه میدهیم.
Thread چیست؟
Thread کوچکترین واحد اجرایی در یک برنامه است. یک برنامه میتواند چندین Thread داشته باشد که به صورت همزمان اجرا میشوند. Threadها حافظه و منابع فرآیند اصلی را به اشتراک میگذارند، بنابراین میتوانند به راحتی با یکدیگر ارتباط برقرار کنند.
چرا از Multithreading استفاده کنیم؟
بهبود عملکرد: برای کارهایی که نیاز به انتظار دارند (مانند I/O Operations)، Multithreading میتواند زمان اجرا را کاهش دهد.
پاسخگویی بهتر: در برنامههای گرافیکی یا وبسرورها، Multithreading باعث میشود برنامه به درخواستهای کاربران سریعتر پاسخ دهد.
استفاده بهینه از منابع: با استفاده از Multithreading، میتوانید از منابع سیستم مانند CPU و حافظه بهینهتر استفاده کنید.
ماژول threading در پایتون
پایتون برای کار با Threadها، ماژول threading
را ارائه میدهد. این ماژول ابزارهای لازم برای ایجاد و مدیریت Threadها را در اختیار شما قرار میدهد.
ایجاد یک Thread ساده
برای ایجاد یک Thread، ابتدا باید یک تابع تعریف کنید که قرار است در Thread اجرا شود. سپس از کلاس Thread
در ماژول threading
استفاده کنید.
مثال ساده:
import threading
def print_numbers():
for i in range(10):
print(i)
# ایجاد یک Thread
thread = threading.Thread(target=print_numbers)
# شروع اجرای Thread
thread.start()
# منتظر ماندن تا Thread کارش تمام شود
thread.join()
print("Thread execution completed.")
توضیح کد:
تابع
print_numbers
: این تابع اعداد ۰ تا ۹ را چاپ میکند.threading.Thread
: یک Thread جدید ایجاد میکند که تابعprint_numbers
را اجرا میکند.thread.start()
: Thread را شروع میکند.()thread.join
: منتظر میماند تا Thread کارش تمام شود.
مدیریت چندین Thread
شما میتوانید چندین Thread ایجاد کنید و آنها را به صورت همزمان اجرا کنید.
مثال:
import threading
def print_numbers(thread_name):
for i in range(5):
print(f"{thread_name}: {i}")
# ایجاد دو Thread
thread1 = threading.Thread(target=print_numbers, args=("Thread-1",))
thread2 = threading.Thread(target=print_numbers, args=("Thread-2",))
# شروع اجرای Threadها
thread1.start()
thread2.start()
# منتظر ماندن تا Threadها کارشان تمام شود
thread1.join()
thread2.join()
print("All threads completed.")
توضیح کد:
args
: برای ارسال آرگومانها به تابع استفاده میشود.هر Thread به صورت مستقل اجرا میشود و خروجی آنها ممکن است با هم ترکیب شود.
مشکلات Multithreading و راهحلها
Race Condition: هنگامی که چند Thread به یک منبع مشترک دسترسی داشته باشند، ممکن است مشکلاتی پیش بیاید.
Deadlock: هنگامی که دو Thread منتظر یکدیگر بمانند، برنامه قفل میکند.
برای حل این مشکلات، از Lock استفاده میکنیم.
مثال استفاده از Lock:
import threading
# ایجاد یک Lock
lock = threading.Lock()
def print_numbers(thread_name):
for i in range(5):
lock.acquire() # قفل کردن
print(f"{thread_name}: {i}")
lock.release() # آزاد کردن قفل
# ایجاد دو Thread
thread1 = threading.Thread(target=print_numbers, args=("Thread-1",))
thread2 = threading.Thread(target=print_numbers, args=("Thread-2",))
# شروع اجرای Threadها
thread1.start()
thread2.start()
# منتظر ماندن تا Threadها کارشان تمام شود
thread1.join()
thread2.join()
print("All threads completed.")
توضیح کد:
()lock.acquire
: قبل از دسترسی به منبع مشترک، قفل میشود.()lock.release
: پس از اتمام کار، قفل آزاد میشود.
پروژه دانلود همزمان چند فایل
ب رای درک بهتر مفاهیم ارائه شده در این مثال، از Multithreading برای دانلود همزمان چند فایل از اینترنت استفاده میکنیم.
کد:
import threading
import requests
def download_file(url, filename):
response = requests.get(url)
with open(filename, 'wb') as file:
file.write(response.content)
print(f"{filename} downloaded.")
# لیست URL فایلها
urls = [
"https://example.com/file1.zip",
"https://example.com/file2.zip",
"https://example.com/file3.zip"
]
# ایجاد Threadها
threads = []
for i, url in enumerate(urls):
filename = f"file{i+1}.zip"
thread = threading.Thread(target=download_file, args=(url, filename))
threads.append(thread)
thread.start()
# منتظر ماندن تا همه Threadها تمام شوند
for thread in threads:
thread.join()
print("All files downloaded.")
توضیح کد:
تابع
download_file
: یک فایل را از URL داده شده دانلود میکند و در فایل محلی ذخیره میکند.ایجاد Threadها: برای هر URL یک Thread ایجاد میشود.
()thread.join
: منتظر میماند تا همه Threadها کارشان تمام شود.
جمعبندی
در این مقاله، با مفاهیم پایهای Multithreading در پایتون آشنا شدید. یاد گرفتید چگونه Thread ایجاد کنید، چندین Thread را مدیریت کنید و از Lock برای جلوگیری از مشکلات Race Condition استفاده کنید. در نهایت، یک مثال کاربردی برای دانلود همزمان چند فایل ارائه شد.
Multithreading یک ابزار قدرتمند است، اما نیاز به دقت و مدیریت دارد تا از مشکلاتی مانند Deadlock یا Race Condition جلوگیری شود.
دیدگاهتان را بنویسید