چند نخی در پایتون یکی از بهترین روش‌ها برای انجام کارهای مختلف به صورت هماهنگ با یکدیگر است. کامپیوتر‌ها با کمک تکنیک «چند نخی» (Multithreading) می‌توانند چندین وظیفه‌ همزمان را اجرا کنند. انسان‌ها توانایی انجام چند کار همزمان را ندارند. اما ماشین‌ها فرق می‌کنند. آن‌ها می‌توانند محاسبات و وظایف مختلف را همزمان با هم پردازش کنند. پیاده‌سازی چند نخی در پایتون شامل اجرای تکنیک‌هایی است که کارایی را افزایش داده و مصرف منبع زمان را کاهش می‌دهند. زبان برنامه نویسی پایتون یکی از زبان‌های سطح بالا، قدرتمند و پرکاربرد است. پیاده‌سازی تکنیک چند نخی در پایتون باعث شده که این زبان پروژه‌های متنوع‌تری را اجرا کند.

آنچه در این مطلب می‌آموزید:

  • متوجه می‌‌شویم که فرایند در برنامه نویسی چیست و چگونه پردازش می‌شود.

  • با مفهوم چند نخی در برنامه نویسی آشنا شده و روش پیاده‌‌سازی آن را در پایتون یاد می‌گیریم.

  • با مفهوم Multiprocessing و تفاوت آن با پایتون آشنا می‌شویم.

  • سناریو‌های مهم برای استفاده از چند نخی در پایتون را یاد می‌گیریم.

  • روش استفاده از ماژول‌های پایتون برای پیاده‌سازی چند نخی را یاد می‌گیریم.

  • مهم‌ترین مزیت‌های استفاده از چند نخی را متوجه می‌شویم.

فهرست مطالب این نوشته
997696

در این مطلب از مجله فرادرس به بررسی «چند نخی» (Multithreading) در پایتون می‌پردازیم. ابتدا این مبحث و چند مفهوم مرتبط با آن را به صورت کامل توضیح می‌دهیم. سپس آن را با Multiprocessing مقایسه می‌کنیم. در ادامه، ماژول‌های پایتون برای پیاده‌سازی تکنیک چند نخی را معرفی کرده‌ و با استفاده از مثال‌های کدنویسی شده روش استفاده از هر ماژول را بررسی می‌کنیم. در نهایت‌ هم مهم‌ترین مزایای استفاده از چند نخی را توضیح خواهیم داد.

چند نخی در برنامه نویسی به چه گفته می‌‌شود؟

در علوم کامپیوتر به فرایند‌‌های کوچک و سبک، «نخ» (Thread) گفته می‌شود. به عبارت دیگر چنین می‌توان گفت که نخ چیزی نیست به غیر از «جریان مستقل اجرا» (Independent Flow Of Execution). هر نخ را می‌توان به عنوان نمونه‌ای از فرایند‌ نیز توصیف کرد. همین‌طور که گفتیم، به برنامه‌های درحال اجرا فرایند گفته می‌شوند.

به بیان ساده‌تر، نخ به دنباله‌ای از دستورالعمل‌ها گفته می‌شود که کامپیوتر به صورت منظم اجرا می‌کند. نخ‌ها به صورت مستقل از هم اجرا می‌‌شوند. بسته به سناریو کلی برنامه، نخ‌ها می‌توانند با یکدیگر جابه‌جا شده یا به خواب بروند. یعنی اینکه منتظر رویدادن شرایط خاصی برای ادامه اجرای خود بمانند.

توجه: «پیش‌دستی» (Preemption)، به معنای متوقف کردن وظیفه‌ای برای مدت زمان موقتی است. این وظیفه بعدا ادامه کار خود را انجام می‌دهد. به عبارت دیگر، نخ خاصی توسط پردازنده به صورت موقتی متوقف می‌شود. بعد از به وجود آمدن شرایط لازم، دوباره اجرای خود را ادامه می‌دهد. در پایتون ۳، به نظر می‌رسد، همه نخ‌ها به صورت همزمان اجرا می‌شوند.

برای پیاده‌سازی راحت چند نخی در پایتون دو ماژول مهم فراهم شده‌‌اند. این ماژول‌ها را در پایین، نام برده‌ایم.

  • کتابخانه Thread
  • کتابخانه Threading
ماژول های پایتون

با استفاده از ماژول Threading در پایتون می‌توانیم چند نخی را به شکل ساده و کارآمد پیاده‌سازی کنیم. این ماژول، API بسیار آسان و قابل فهمی دارد. با کمک این ماژول می‌توانیم نخ‌های زیادی تولید و مدیریت کنیم.

در ادامه، بعد از ارائه توضیح کوتاهی درباره فرایند، چند نخی در پایتون را به شکل کامل بررسی کرده‌ایم.

فرایند چیست؟

به برنامه در حال اجرا، فرایند گفته می‌شود. برنامه یا اپلیکیشن‌های مختلفی در کامپیوتر اجرا می‌شوند. برای مثال به مرورگر اینترنت اشاره می‌کنیم. سیستم عامل با همه این برنامه‌ها مانند یک فرایند رفتار می‌کند. هر فرایندی ممکن است شامل چندین نخ قابل اجرا باشد. این نخ‌ها به صورت همزمان اجرا می‌شوند.

در تصویر زیر یک فرایند را می‌بینید که شامل دو نخ مجزا از هم است. این نخ‌ها در طول زمان به صورت موازی هم اجرا می‌شوند.

نخ‌ها در طول زمان به صورت موازی با هم اجرا می‌شوند.
نخ‌ها متعلق به فرایند یکسانی هستند و به صورت همزمان اجرا می‌شوند.

چند نخی در پایتون چیست؟

یکی از راه‌های صرفه‌جویی در زمان و افزایش کارایی برنامه، استفاده از چند نخی در پایتون است. چند نخی در پایتون تکنیک بسیار پراستفاده‌ای است. به کار بردن این تکنیک باعث می‌شود که چندین وظیفه مجزا از هم بتوانند به صورت موازی و همزمان اجرا شوند. به عبارت ساده‌تر، به توانایی سی پی یو کامپیوتر برای اجرای چندین نخ مختلف به صورت همزمان «چند نخی» (Multithreading) گفته می‌شود.

زبان برنامه نویسی پایتون با استفاده از تکنیک چند نخی فضای داده و منابع محاسباتی کامپیوتر را بین چندین نخ مختلف و نخ اصلی برنامه به اشتراک می‌گذارد. پیاده‌سازی این تکنیک در پایتون به صورتی است که نخ‌ها به سادگی و بدون از دست رفتن اطلاعات با یکدیگر ارتباط برقرار می‌کنند.

چهار مستطیل زرد به یک مستطیل آبی اشاره می‌کنند.

آموزش مطالب پیشرفته برنامه نویسی در فرادرس

برنامه نویسی یکی از کاربردی‌ترین مهارت‌ها برای ورود به بازار کار است. اما این مهارت فقط مخصوص دانشجویان و فارغ‌التحصیلان رشته مهندسی کامپیوتر نیست. فعالان سایر رشته‌ها نیز به آن نیاز دارند. هر سال، شغل‌های بیشتری به مهارت برنامه نویسی احتیاج پیدا می‌کنند. برنامه نویسی یکی از شرط‌های اصلی، برای ورود به بسیاری از موقعیت‌های شغلی است. همچنین بیشتر تحقیق‌ و پژوهش‌های دانشگاهی نیز با کمک کامپیوتر انجام می‌شوند. برای پیاده‌سازی بسیاری از ایده‌ها و الگوریتم‌ها، باید آن‌ها را به شکل برنامه بنویسیم. به همین دلیل، یاد گرفتن برنامه نویسی برای بیشتر دانشجویان ضروری است.

مجموعه آموزش برنامه نویسی – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی از مقدماتی تا پیشرفته هدایت شوید.

گروه آموزشی فرادرس با سال‌ها تجربه در زمینه تهیه و تولید محتوای آموزشی، یکی از معتبر‌ترین مراجع برای یاد گرفتن برنامه نویسی است. دانشجویان،‌ افراد شاغل و علاقه‌مندان زیادی هر ساله برای افزایش مهارت‌های خود یا ارتقای موقعیت‌شان از فرادرس کمک می‌گیرند. فیلم‌های آموزشی فرادرس با کمک اساتید باتجربه و با کیفیت بالا تهیه شده‌اند. استفاده از این فیلم‌ها تاثیر بسیار زیادی در افزایش مهارت‌های افراد دارد.

در پایین چند مورد از فیلم‌های فرادرس درباره مطالب پیش‌رفته برنامه نویسی را معرفی کرده‌ایم.

برای مشاهده فیلم‌های بیشتر بر روی تصویر بالا کلیک کنید. در بخش بعدی،‌ Multiprocessing و تفاوت آن با چند نخی را بررسی کرده‌‌ایم.

Multiprocessing چیست؟

به توانایی «پردازنده» (CPU) در اجرای چندین فرایند مجزا از هم به صورت همزمان «چندپردازشی» (Multiprocessing) گفته می‌شود. این فرایند‌ها هیچ اطلاعاتی را با یکدیگر به اشتراک نمی‌گذارند. چندپردازشی،‌ فرایند‌های مختلف را به چندین بخش کوچکتر تقسیم می‌کنند. هر بخش به صورت مستقل از دیگران اجرا می‌شود.

باید توجه کنید که چند نخی با چند‌پردازشی تفاوت دارد. در بخش بعدی، این مطلب را به روش بهتری توضیح داده‌ایم. برای آموزش حرفه‌ای پردازش موازی می‌توانید فیلم آموزش الگوریتم موازی و پردازش موازی را در فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار داده‌ایم.

با بیشتر شدن تعداد وظایف پردازنده‌ها مدیریت آن‌ها هم مشکل‌تر می‌شود. فایده استفاده از تکنیک «چندپردازشی» (Multiprocessing) اینجا مشخص می‌شود. چند‌پردازشی سعی می‌کند به هر فرایند، پردازنده یا هسته مربوط به آن را اختصاص بدهد. در این حالت، اجرای فرایند‌ها نرم‌تر و ساده‌تر می‌شود.

توجه: در بحث مربوط به سیستم‌های دارای پردازنده چندهسته‌ای مانند اینتل «i3» هر هسته از پردازنده به یک فرایند، اختصاص داده می‌‌شود.

چند نخی در پایتون در مقابل Multiprocessing

این دو تکنیک اجرای فرایند در پردازنده‌ دارای تفاوت‌های مهمی با یکدیگر هستند. به عنوان توسعه‌دهنده بهتر است با این تفاوت‌ها آشنا باشیم.

در این بخش از مطلب، ویژگی‌های مربوط به هر کدام از تکنیک‌های چند نخی و چندپردازشی را به صورت مجزا تعریف کرده‌ایم.

ویژگی‌های تکنیک چند نخی

برای مقایسه چند نخی با چندپردازشی چهار ویژگی زیر را مورد بررسی قرار داده‌ایم.

  • تعریف: «چند نخی» (Multithreading) به تکنیکی گفته می‌شود که در آن فرایندی برای انجام وظیفه‌اش، چندین نخ هم‌زمان را اجرا می‌کند.
  • کارکرد در پایتون: در زبان پایتون برای انجام کارهای زیاد به صورت «همزمان» (Concurrency) از چند نخی، استفاده می‌شود.
  • روش کار: چند نخی در پایتون به این صورت است که انگار چندین نخ مختلف به صورت همزمان اجرا می‌شوند. اما در واقع این نخ‌ها با سرعت زیاد و به نوبت پشت سر هم اجرا می‌شوند.
  • پردازش توسط پایتون: «قفل مفسر سراسری» (Global Interpreter Lock | GIL) در پایتون از اجرای همزمان نخ‌ها جلوگیری می‌کند.
مستطیل زرد و آبی برای نمایش ویژگی‌های تکنیک چند نخی

ویژگی‌های تکنیک چندپردازشی

ویژگی‌هایی را که درباره چند نخی بررسی کرده‌ بودیم، درباره چندپردازشی هم بررسی می‌کنیم.

  • تعریف: چند‌پردازشی به روشی گفته می‌شود که در طی آن چندین فرایند مختلف به صورت همزمان و موازی با هم اجرا می‌شوند. هر کدام از این فرایند‌ها بر روی پردازنده یا هسته‌ای مجزا اجرا می‌شود.
  • کارکرد در پایتون: چندپردازشی در پایتون برای اجرای واقعی چندین وظیفه مختلف به صورت «موازی» (Parallelism) به کار برده می‌شود.
  • روش کار: در چندپردازشی، به معنای واقعی موازی‌کاری می‌شود. در این تکنیک، ماژول چندپردازشی به اجرای فرایند‌های مجزا از هم، در زمان یکسان کمک می‌کند.
  • پردازش توسط پایتون: در تکنیک چند‌پردازشی، هر فرایند،‌ مفسر پایتون مربوط به خود را دارد. این مفسر‌ها، فرایند‌ها را به صورت جدا از هم اجرا می‌کنند.
یک مستطیل زرد رنگ به سه مستطیل آبی متصل شده است.

چرا و چه وقتی از چند نخی در پایتون استفاده کنیم؟

اگر بخواهیم که وظایف و اپلیکیشن‌های در حال اجرا را به چندین «زیروظیفه» (Sub-Tasks) مختلف تقسیم کرده و سپس آن‌ها را به صورت موازی اجرا کنیم، استفاده از چند نخی در پایتون بهترین گزینه است. تمام جنبه‌های مختلف مانند کارایی، رندرکردن، سرعت اجرای اپلیکیشن و میزان مصرف منبع زمان، با استفاده از چند نخی در پایتون به میزان بسیار زیادی ارتقا پیدا می‌کند.

نکته: فقط وقتی از چند نخی در پایتون استفاده کنیم که نخ‌ها به یکدیگر وابسته نباشند.

شروع نخ جدید

بعد از درک این مطلب که نخ چیست و چه کاربردی دارد، اکنون زمان یاد گرفتن ساخت نخ‌ در پایتون است. پایتون برای انجام این کار، کتابخانه استانداردی به نام «Threading» ارائه داده است. با کمک این کتابخانه می‌توانیم تمام فرایند چند نخی در پایتون را پیاده‌سازی کنیم.

در پایتون دو ماژول مختلف «Thread» و «Threading» برای راه‌اندازی نخ‌ها وجود دارند. در ادامه این بخش از مطلب، این دو ماژول را بررسی کرده‌ایم.

استفاده از ماژول Threading

در کادر پایین، روش به‌کارگیری کدها برای ساخت نخ جدید با کمک مثال ساده‌ای بررسی شده است. در این کد از ماژول Threading  استفاده کرده‌ایم.

بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده می‌شود.

I am in thread1. Current Thread in Execution is Thread-1
I am in thread2. Current Thread in Execution is Thread-2

استفاده از ماژول Thread

در کادر زیر، مثالی درباره روش ساخت نخ جدید با استفاده از ماژول Thread بررسی شده است.

همین‌طور که در بالا مشاهده می‌کنید برای ایمپورت کردن این ماژول باید آن را به صورت _thread بنویسیم. بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده می‌شود.

This is thread1
This is thread2

نکته: خروجی کد بالا ممکن است در اجراهای مختلف به شکل‌های متفاوتی نمایش داده ش

ود. این مسئله بخاطر آن است که استفاده از ماژول _thread برای پیاده‌سازی چند نخی در پایتون پایدار نیست. یعنی همیشه نتیجه یکسانی تولید نمی‌شود.

هیچ‌ کسی نمی‌داند که کدام ماژول اول از همه اجرا می‌شود. ماژول _thread مانند توابع معمولی با نخ‌ها کار می‌کند. اما ماژول Threading  با نخ‌ها مانند اشیا – در مبحث شیء گرایی – رفتار می‌کند. یعنی اینکه هر نخ مربوط به یک شیء مجزا است. ماژول _thread قدیمی بوده و اکنون استفاده زیادی از آن نمی‌شود. تنها دلیل وجود داشتن ماژول _thread، آن است که از کدهای قدیمی پایتون پشتیبانی کند.

نمونه‌ای از چندین نخ رنگی و نورانی که بین المان‌های سخت‌افزاری مختلف در حال عبور و مرور هستند.

در بین این دو روش، توصیه شده که از ماژول Threading  استفاده کنیم. در بخش‌های بعدی مطلب، بیشتر درباره این ماژول صحبت کرده و مثال‌های خود را با کمک آن پیاده‌سازی می‌کنیم. یکی از دلایل برتری ماژول Threading  آن است که از ابزارهایی با کاربری آسان استفاده می‌کند. این ابزارها به توسعه‌دهندگان برای کنترل زمان اجرای نخ‌ها کمک می‌کنند. در نتیجه خوانایی برنامه بیشتر شده و درک منطق آن ساده‌تر می‌شود.

مفهوم چند نخی، مفهوم پیش‌رفته و گسترده‌ای است که فقط به زبان برنامه نویسی پایتون محدود نمی‌شود. این تکنیک در سایر‌ زبان‌های برنامه نویسی و تقریبا بیشتر سیستم عامل‌های مدرن به کار برده می‌‌شود. برای آشنایی هرچه بیشتر با چند نخی در سیستم عامل، پیشنهاد می‌کنیم که مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.

چگونه از فرادرس برای یاد گرفتن پایتون کمک بگیریم؟

گروه آموزشی فرادرس، به شکل مداوم در حال تولید و انتشار محتوای آموزشی در زمینه‌های گوناگون است. یکی از این زمینه‌ها – که اتفاقا بسیار هم پرطرفدار است – به زبان پایتون مربوط می‌شود. فرادرس فیلم‌های آموزشی بسیار خوبی درباره یادگیری پایتون منتشر کرده است. مراحل اولیه شروع یادگیری پایتون، ساده هستند و خیلی سریع پیش می‌روند. این مراحل را می‌توانید با کمک فیلم‌هایی مانند فیلم آموزش رایگان پایتون، برنامه نویسی سریع و آسان در ۱۴۰ دقیقه و چند فیلم دیگر یاد بگیرید. اما در مباحث پیشرفته‌ای مانند شبکه‌های عصبی و یادگیری ماشین باید از فیلم‌های حرفه‌‌ای‌تری استفاده کنید.

تهیه فیلم‌های آموزشی فرادرس یکی از مقرون‌به‌صرفه‌ترین روش‌های آموزش است. در پایین، چند مورد از فیلم‌های آموزشی مربوط به این زبان را معرفی کرده‌ایم.

برای مشاهده فیلم‌های بیشتر بر روی تصویر زیر کلیک کنید.

مجموعه آموزش پروژه محور برنامه نویسی پایتون (Python)
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش پروژه محور برنامه نویسی پایتون هدایت شوید.

ماژول Threading

ماژول «Threading» روشی برای پیاده‌سازی سطح بالای تکنیک چند نخی در پایتون است. این ماژول رویکرد بسیار سرراستی برای مدیریت اپلیکیشن‌های چند نخی دارد. مزایای استفاده از ماژول Threading  بسیار بیشتر از ماژول «Thread» است.

در ماژول Threading  متدهای بسیار بیشتری نسبت به متدهای موجود در ماژول _thread  وجود دارند. به عنوان مثال می‌توانیم به سه متد مهم زیر، اشاره کنیم.

  • Threading.activeCount(): این متد، تعداد نخ‌های فعال را شمرده و برمی‌گرداند.
  • Threading.currentThread(): این متد تعداد اشیایی را برمی‌گرداند که تحت کنترل نخ هستند. این نخ، توسط برنامه – در حال فعالیت – فعلی اجرا شده است.
  • Threading.enumerate(): این متد، فهرستی از تمام اشیاء نخ فعال را برمی‌گرداند.

کار کردن با چندین نخ مختلف

اغلب اوقات، توسعه‌دهندگان در حال کار با چند نخ مختلف هستند. با انجام این کار آن‌ها می‌توانند وظایف جالبی را اجرا کنند. همین‌طور که در بخش‌های بالایی مطلب مشاهده کردیم، توسعه‌دهندگان می‌توانند نخ‌ها را به شکل مستقل از هم ایجاد کنند. اما راه ساده‌تر و کارآمدتری هم برای اجرای این عملیات وجود دارد. برای ساخت نخ‌های مختلف می‌توانیم از تابع ThreadPoolExecutor  در پایتون استفاده کنیم. در ادامه روش استفاده از این تابع را آموزش داده‌ایم.

استفاده از تابع ThreadPoolExecutor در پایتون

راحت‌ترین روش برای کارکردن با چندین نخ مختلف در پایتون استفاده از تابع ThreadPoolExecutor  است. این تابع در یکی از کتابخانه‌های استاندادر پایتون قرار دارد. برای استفاده از این تابع، باید کتابخانه concurrent.features  را به محیط کدنویسی خود وارد کنیم.
با استفاده از عبارت with  برنامه نویسان می‌توانند «مدیر زمینه» (Context Manager) ایجاد کنند. با کمک این ابزار، برنامه نویسان «استخر نخ» (Thread Pool) را به راحتی ایجاد کرده یا حذف می‌کنند. در کادر پایین، سینتکس مربوط به ساخت ThreadPoolExecutor  را نوشته‌ایم.

در سینتکس بالا پارامتری به نام max_worker  وجود دارد. مقدار این پارامتر باید عدد صحیح باشد. این مقدار با توجه به سناریو برنامه می‌تواند هر عددی باشد.

در کدهای پایین، روش استفاده از این تابع را برای ساخت نخ بررسی کرده‌ایم.

بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده می‌شود.

Executing the given task
I: 45
The task is executed <Thread(ThreadPoolExecutor-0_0, started daemon 140005618887456)>
Executing the given task
I: 45
The task is executed <Thread(ThreadPoolExecutor-0_0, started daemon 140005618887456)>

شرایط رقابتی

در زمان کار با تکنولوژی چند نخی در پایتون، «شرایط رقابتی» (Race Conditions) یکی از مهم‌ترین مشکلاتی هستند که با آن‌ها روبه‌رو خواهید شد. در بیشتر مواقع، شرایط رقابتی، زمانی روی ‌می‌دهند که دو یا چند نخ مختلف به تکه‌های مشترکی از داده و منابع دسترسی پیدا کنند. در چند «نخی بی‌درنگ» (Realtime Multithreading) در پایتون، همپوشانی نخ‌ها باعث بروز این اتفاق می‌شود. راه حل این مشکل،‌ همگام‌سازی نخ‌ها است. در بخش بعدی مطلب، همگام‌سازی نخ‌ها را مورد بررسی قرار داده‌ایم.

همگام سازی نخ‌ ها

در زبان برنامه نویسی پایتون،‌ برای مدیریت هرچه بهتر عملکرد نخ‌ها، می‌توان مکانیزم قفل‌گذاری خاصی ‌را پیاده‌سازی کرد. این مکانیزم، درباره همگام‌سازی نخ‌ها به برنامه نویسان کمک می‌کند.

روش همگام‌سازی نخ‌ها در کنار یکدیگر

قفل اصلی «همگام‌سازی سطح پایین» (Low-Level Synchronization) با استفاده از ماژول Thread پیاده‌سازی شده است. هر نخی باید در یکی از دو حالت زیر باشد.

کلاسی که برای ساختن قفل‌های اولیه به کار برده می‌شود، Lock نام دارد. اشیاء ساخته شده از کلاس «Lock» به نخ‌ها کمک می‌کنند که یکی پس از دیگری اجرا ‌شوند. در هر لحظه فقط یک نخ می‌‌تواند Lock را در اختیار، داشته باشد.

هر شیء Lock از ۲ متد اصلی پشتیبانی می‌کند . این متدها را در فهرست زیر معرفی کرده‌ایم.

  • acquire(): از این متد برای تغییر دادن حالت Lock-های آزاد استفاده می‌شود. یعنی آن‌ها را قفل می‌کند. اما اگر این Lock از قبل قفل شده باشد، متد acquire()  نادیده گرفته می‌شود.
  • release(): از این متد برای آزاد کردن Lock-هایی استفاده می‌شود که دیگر به کار برده نمی‌شوند. همیشه و در هنگام نیاز می‌توان این متدها را فراخوانی کرد.

متد acquire()  در کلاس Lock دارای پارامتری به نام blocking  است. به منظور کمک به درک بهتر این مطلب از مثال ساده‌ای استفاده کرده‌ایم.

فرض کنید که نخی به نام «T» داریم. همزمان با فراخوانی متدT.acquire()، پارامتر blocking  را نیز به آن ارسال می‌کنیم. پارامتر blocking  فقط می‌تواند دو مقدار از نوع «Boolean» داشته باشد، «True» یا «False». در نتیجه، ممکن است دو سناریو مختلف، پیش‌ بیایند. این دو سناریو را در پایین توضیح داده‌ایم.

  • حالت اول: فرض کنیم که مقدار پارامتر blocking  برابر با True قرار داده شده است. بنابراین، متد acquire()  را به شکل T.acquire(blocking=True)  فراخوانی می‌کنیم. در این حالت، نخ، قفل T را بدست می‌آورد. البته فقط به شرطی که T هیچ قفل دیگری نداشته باشد. از طرف دیگر،‌ اگر نخ T از قبل قفل شده باشد،‌ فراخوانی تابع acquire()  به حالت تعلیق در می‌آید. یعنی اینکه تا زمان در آمدن T از حالت قفل، همین‌طور منتظر باقی می‌ماند. به محض آزاد شدن نخ T،‌ نخ فراخواننده به سرعت و دوباره آن را قفل می‌کند. یعنی آنکه نخ فراخوانی شده، قفل آزاد شده را بدست می‌آورد.
  • حالت دوم: اگر مقدار پارامتر blocking  برابر با False قرار داده شده و شیء‌T هم آزاد باشد – T.acquire(False)  - در نتیجه، نخ T قفل شده و در خروجی، مقدار True برگردانده می‌شود. در حالی که اگر T را از قبل قفل کرده باشیم. سپس مقدار پارامتر blocking  را برابر با False تنظیم کنیم، متد acquire()  بر روی T تاثیری ندارد. خروجی این متد برابر با False است.

صف اولویت چند نخی در پایتون

با استفاده از ماژول Queue  می‌توانیم شیء صف، ایجاد کنیم. این شیء می‌تواند تعداد عنصر مشخصی را در خود نگهدارد. برای کنترل و مدیریت صف، برنامه نویسان از متدهای زیر استفاده می‌کنند.

  • get(): از این متد برای حذف و برگرداندن عناصر مشخص شده در صف، استفاده می‌شود.
  • put(): این متد برای اضافه کردن عنصر به صف به کار برده می‌شود.
  • qsize(): متد qsize()  تعداد عناصر موجود در صف را شمرده و اعلام می‌کند.
  • empty(): بر اساس خالی یا پر بودن صف، مقادیر True یا False برمی‌گرداند.
  • full(): این متد فقط در صورتی مقدار True برمی‌گرداند که صف پر باشد. در غیر این صورت مقدار False، برگشت داده می‌شود.
یک لپتاپ برای برنامه نویسی که بر روی جاده‌ای روشن با چراغ‌های دو طرف قرار دارد.

اشیا موجود در ماژول Threading

اشیاء مخصوصی در ماژول Threading تعریف شده‌اند. این اشیاء به مدریت نخ‌ها کمک می‌کنند. این اشیا را در فهرست زیر، نام برده‌ایم.

  • «سمافور» (Semaphore)
  • «زمان‌سنج» (Timer)
  • «مانع» (Barrier)

در ادامه این بخش، اشیای نام‌ برده شده در فهرست بالا را یک به یک توضیح داده‌ایم.

Semaphore

شی «سمافور» (Semaphore) در ماژول Threading به عنوان شمارنده به کار برده می‌شود. این شیء دارای ویژگی‌های خاصی است. این ویژگی‌ها را در پایین، نوشته‌ایم.

  • وقتی که تابع release()  را فراخوانی می‌کنیم، مقدار شمارنده افزایش پیدا می‌کند.
  • وقتی که تابع acquire()  را فراخوانی کنیم، مقدار شمارنده کاهش پیدا می‌کند.

تغییرات شمارنده، اتمیک هستند. یعنی آن که این شمارنده‌ها امن هستند. سیستم عامل در وسط عملیات مربوط به کاهش یا افزایش مقدار، نخ‌ را تغییر نمی‌دهد.

زمان سنج

از این شیء برای زمان‌بندی اجرای کارها یا فراخوانی توابع استفاده می‌شود. شیء‌ زمان‌سنج با استفاده از دستور Threading.Timer  فراخوانی می‌شود. برای شروع به کار این ابزار باید از متد .start()  استفاده کنیم. برا متوقف کردن آن‌ هم از متد .cancel()  استفاده می‌کنیم.

مانع یا Barrier

از شیء Barrier  برای همگام‌سازی نخ‌های مختلف استفاده می‌شود. برای استفاده از این شیء‌ آن را با استفاده از دستور Threading.Barrier()  فراخوانی می‌کنیم. در زمان ساخت Barrier  باید تعداد نخ‌هایی را مشخص کنید، که قرار است همگام‌سازی شوند. هر کدام از نخ‌ها – بعد از انجام مقدار وظیفه لازم – به صورت مجزا متد .wait()  را در Barrier  فراخوانی می‌کنند.

نکته: منظور از همگام‌سازی این است که نخ‌ها اجرای کارهای خود را به صورت تکه تکه و هماهنگ با یکدیگر به پیش‌ می‌برند. اگر نخی از دیگران جلو افتاد باید صبر کند تا دیگران هم به انداز آن نخ در انجام وظایف خود پیش‌رفت کنند.

مزایای استفاده از چند نخی در پایتون

استفاده از چند نخی در پایتون دارای مزیت‌های زیادی است. این مسئله باعث شده که چند نخی به یکی از رویکردهای محبوب در کدنویسی تبدیل شود. در این بخش از مطلب، چند مورد از مهم‌ترین مزیت‌های استفاده از چند نخی را شمرده‌ایم.

  1. چند نخی به استفاده بهینه از منابع کمک می‌کند. زیرا نخ‌ها حافظه و فضای داده یکسانی را با همدیگر به اشتراک می‌گذارند.
  2. چند نخی در پایتون باعث می‌‌شوند که وظایف گوناگون به صورت موازی یا همزمان اجرا ‌شوند.
  3. استفاده از چند نخی باعث کاهش مصرف منبع زمان یا زمان پاسخ می‌شود. بنابراین کارایی کلی سیستم افزایش پیدا می‌کند.

جمع بندی

به هر برنامه‌ای که در حال اجرا،‌ فرایند گفته می‌‌شود. مجموعه‌ای از وظایف در هر فرایند باید به صورت متوالی و پشت سر هم اجرا شوند. به این مجموعه وظایف، نخ یا رشته اجرا یا نخ کنترل گفته می‌‌شود. برای پیاده‌سازی چند نخی در پایتون می‌توانیم از ماژول‌های Threading  و _thread استفاده کنیم. این ماژول‌ها توسط پایتون ارائه شده‌اند. ماژول _thread قدیمی‌تر است. بنابراین توصیه شده که تا جای ممکن از ماژول Threading  استفاده کنیم. این ماژول نخ‌ها را مانند اشیا در نظر می‌گیرد.

در این مطلب از مجله فرادرس با چند نخی در پایتون آشنا شده‌ایم. این تکنیک، روش بسیار پرکاربردی برای اجرای وظایف مختلف به صورت همزمان است. به عبارت دیگر، سی پی یو با کمک تکنیک چند نخی می‌تواند چند وظیفه مختلف را به صورت همزمان اجرا کند. چند‌پردازشی به معنای آن است که پردازند می‌تواند چندین فرایند مختلف را به صورت همزمان پردازش کند. در این روش فرایند‌ها هیچ داده‌ای با یکدیگر به اشتراک نمی‌گذارند.

source

توسط expressjs.ir