برنامه نویسی چند نخی Multi Threading
Multithreading در پایتون
در این پست مبانی چند نخی در زبان برنامه نویسی پایتون را پوشش می دهیم. درست مثل چند پردازش (Multi Proccessing)، چند نخی یک راه برای رسیدن به چند وظیفه است. در Multithreading، مفهوم نخ ها و یا thread ها استفاده می شود. ابتدا مفهوم موضوع را در معماری کامپیوتر درک می کنیم.
نخ یا Thread
در محاسبات، یک فرایند نمونه ای از یک برنامه کامپیوتری است که در حال اجرا است. هر فرایند دارای 3 جزء اساسی است:
- یک برنامه اجرایی
- داده های مربوط به برنامه مورد نیاز (متغیرها، فضای کاری، بافر ها و غیره)
- بستر اجرای برنامه (حالت فرآیند)
یک رشته یک نهاد در یک فرآیند است که می تواند برای اجرا برنامه ریزی شود. همچنین، نخ یا thread کوچکترین واحد پردازش است که می تواند در یک سیستم عامل (سیستم عامل) انجام شود. به شکل ساده، یک دنباله از دستورالعمل های درون یک برنامه است که می تواند مستقل از کد دیگر اجرا شود. برای سادگی، شما می توانید فرض کنید که یک موضوع به سادگی یک زیر مجموعه از یک روند است! یک موضوع شامل تمام این اطلاعات در یک Thread Control Block (TCB) می باشد:
- Thread Identifier: شناسه ی منحصر به فرد (TID) به هر موضوع جدید اختصاص دارد
- Stack pointer: اشاره به پشته رشته در روند. پشته شامل متغیرهای محلی تحت دامنه موضوع است.
- Program counter: یک ثبت نام که آدرس دستور آموزش را که در حال حاضر با موضوع اجرا می شود ذخیره می کند.
- Thread state: می تواند در حال اجرا، آماده، انتظار، شروع یا انجام شود.
- Thread’s register set: ثبت نام به موضوع برای محاسبات.
- Parent process Pointer:اشاره گر به بلوک کنترل فرایند که نخ در آن نگهداری و عملی می شود.
نمودار زیر را در نظر بگیرید تا رابطه بین فرآیند و موضوع آن را درک کنید:
Multithreading
چندین رشته در یک فرایند وجود دارد که:
- هر موضوع شامل تنظیمات ثبت نام خود و متغیرهای محلی (ذخیره شده در پشته) است.
- تمام رشته فرایند متغیرهای جهانی (ذخیره شده در heap) و کد برنامه را به اشتراک می گذارند.
نمودار زیر را در نظر بگیرید تا ببینید که چندین موضوع در حافظه وجود دارد:
Multithreading به عنوان توانایی یک پردازنده برای اجرای چندین رشته همزمان تعریف شده است. (در یک پردازنده ساده و تک هسته ای، با استفاده از تغییر مکرر بین موضوعات، به دست می آید. این به معنای تعویض زمینه است. در تعویض زمینه، حالت یک موضوع ذخیره می شود و وضعیت دیگری که هربار که هر وقفه (به دلیل ورودی / خروجی یا دستی تنظیم می شود) بارگیری می شود. تعویض متن به گونه ای غالبا اتفاق می افتد که همه موضوعات به طور همزمان اجرا می شوند (این به عنوان چند وظیفه نامیده می شود)).
نمودار زیر را در نظر بگیرید که در آن یک پروسه حاوی دو موضوع فعال است:
در Python، ماژول threading یک API بسیار ساده و بصری برای ایجاد چند موضوع در یک برنامه فراهم می کند. اجازه دهید ما یک نمونه ساده را با استفاده از ماژول threading بررسی کنیم:
# Python program to illustrate the concept
# of threading
# importing the threading module
import threading
def print_cube(num):
#function to print cube of given num
print("Cube: {}".format(num * num * num))
def print_square(num):
#function to print square of given num
print("Square: {}".format(num * num))
if __name__ == "__main__":
# creating thread
t1 = threading.Thread(target=print_square, args=(10,))
t2 = threading.Thread(target=print_cube, args=(10,))
# starting thread 1
t1.start()
# starting thread 2
t2.start()
# wait until thread 1 is completely executed
t1.join()
# wait until thread 2 is completely executed
t2.join()
# both threads completely executed
print("Done!")
خروجی قطعه کد بالا:
Square: 100
Cube: 1000
Done!
وقت آن رسیده تا قطعه کد را تفسیر کنیم:
- برای وارد کردن ماژول threading، ما انجام می دهیم:
import threading
- برای ایجاد یک موضوع جدید، ما یک شی از کلاس Thread ایجاد می کنیم. استدلال های زیر را می گیرد:target: تابع به وسیله thread اجرا می شود args: استدلال هایی که به تابع هدف منتقل می شونددر مثال فوق، ما 2 موضوع با توابع هدف مختلف ایجاد کردیم:
t1 = threading.Thread(target=print_square, args=(10,)) t2 = threading.Thread(target=print_cube, args=(10,))
- برای شروع یک موضوع، از روش شروع کلاس Thread استفاده می کنیم.
t1.start() t2.start()
- هنگامی که موضوعات شروع می شود، برنامه فعلی (شما می توانید آن را به عنوان یک موضوع اصلی فکر می کنید) نیز در اجرای اجرا می شود. برای جلوگیری از اجرای برنامه فعلی تا زمانی که موضوع کامل شود، از روش پیوست استفاده می کنیم.
t1.join() t2.join()
برای درک بهتر این که چگونه برنامه فوق کار می کند، نمودار زیر را در نظر بگیرید:
بسیار شیوا و عالی توضیح دادین فقط کاش متد های بیشتری رو پوشش میدادین.
با تشکر
این دروس صرفا برای پایه هستش که افراد عملگر های پایه رو درک کنن و اگر خواستن چیزی رو توسعه بدن قبلش بدونن با چه مبانی طرف هستن، قرار هم نبوده که پیشرفته به این موضوع بپردازیم، برای قسمت های مهم تر دوره concurrency پایتون رو خواهم ساخت که لایه های مختلف سرعت در پایتون رو بررسی کنیم
خیلی عالی توضیح دادید خیلی ممنونم برای زمانی که گذاشتید امیدوارم موفق باشید