برنامه نویسی چند نخی Multi Threading

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Aug 24, 2020

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()
    در نتیجه، برنامه فعلی ابتدا برای تکمیل t1 و سپس t2 صبر می کند. یکبار، آنها تمام شده اند، اظهارات باقیمانده برنامه فعلی اعدام می شوند.

برای درک بهتر این که چگونه برنامه فوق کار می کند، نمودار زیر را در نظر بگیرید:

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
captcha
0دیدگاه