اینکه ترد چیست و چرا در میکروپایتون از آن استفاده میکنیم، برمیگردد به دومین کارگاه آنلاین میکروپایتون که با تیمم به دنبال آخرین و به روز ترین کلاس ها برای یادگیری بودیم. اینکه آیا ترد Thread در میکروپایتون هم جایی دارد؟ در این آموزش به معرفی ترد Thread و روش استفاده از آن در برد رزبری پای پیکو با میکروپایتون میپردازیم. در ادامه آموزش ایجاد ترد Thread با مرجع تخصصی میکروپایتون به زبان فارسی، دیجی اسپارک همراه باشید.
ترد Thread
ما در طول یک کار چندین پروسه داریم که هر پروسه شامل اطلاعات و دیتا مربوط به برنامه ی در حال اجرا را دارد. هر پروسه ممکن است از چندین پروسه زیرلایه تر تشکیل شده باشد که یک سری تسک و وظایف را بایستی انجام دهند. حال تصور کنید پردازشگر بخواهد تمامی این پروسه ها را همزمان با یکدیگر اجرا کند! چه اتفاقی خواهد افتاد؟ برای اینکار بایستی از مفهوم Thread استفاده کنیم. ترد Thread در حقیقت یک بخش از برنامه است که CPU برنامه ها را از داخل ترد Thread تقسیم بندی کرده و در زمان های مختلف زمانی را به هر Thread اختصاص میدهد تا حالت همزمانی اجرای برنامه ها به وجود بیاید. پس زمانی که بخواهیم چندین تسک را به صورت همزمان انجام دهیم باید از قابلیت ترد Thread استفاده کنیم. اما در گوشه ی ذهن داشته باشید که این عملیات واقعا همزمان نیستند. اما CPU اینقدر زمان بندی را سریع بین تردهای مختلف انجام میدهد که به نظر این هم زمانی جلوه میکند.
اما CPU در پشت صحنه اجرای منظم و همزمان تردها را مدیریت میکند و به هر ترد thread یک زمان میدهد تا در طول آن زمان ترد تسک مورد نظر را اجرا کند. هنگامی که زمان اختصاص داده شده به ترد thread به پایان برسد، CPU ترد دیگری را اجرا میکند تا مجدد به همان Thread برسد و دستوراتش را اجرا کند. مهمترین کاری که تردها انجام میدهند این است که اگر پردازش های سنگین داشته باشیم، میتوانیم پردازش ها را در یک ترد اجرا کنیم و از فریز شدن و قفل شدن برنامه جلوگیری کنیم. در صورت استفاده از thread میتوانیم از هر دو هسته رزبری پای پیکو استفاده کنیم. در پایتون این قابلیت را داریم که یک یا چندین کار به صورت همزمان اجرا شوند. برای اینکار از ماژول _thread استفاده میشود. در زیر روش فراخوانی ترد آموزش داده شده است. بررسی کنید.
import _thread import time def th_func(delay, id): while True: time.sleep(delay) print('Running thread %d' % id) for i in range(2): _thread.start_new_thread(th_func, (i + 1, i))
متد ترد thread
ترد thread در رزبری پای پیکو
از نکات قابل توجه در برد رزبری پای پیکو دارا بودن دو هسته Core است. به این معنی که میتوانید به راحتی تسک های چند رشته ای multithreaded را به کمک ترد پیاده سازی کنید. اما بزرگترین چالش اینجاست که رزبری پای پیکو فاقد Operating system سیستم عامل است که بتواند چرخه های CPU را مدیریت کند به همین دلیل هر هسته فقط یک ترد را قبول میکند.
import machine import utime import _thread internal_led = machine.Pin(25, machine.Pin.OUT) def sec_thread(): while True: print("task one") utime.sleep(1) _thread.start_new_thread(sec_thread, ()) while True: internal_led.toggle() utime.sleep(0.25)
مثال دوم برای ایجاد ترد Thread
در مثال دوم یک تسک برای ال ای دی در نظر گرفته شده است که با هر بار فعال شدن، ال ای دی ۱۰ بار به مدت ۰٫۱ ثانیه چشمک زن شده و پس از پایان پیغام Endtask را نمایش میدهد.
مثال سوم برای ایجاد ترد Thread
در مثال سوم عملکرد thread به این صورت است که یکی از هسته ها هر ثانیه یک عدد زوج را چاپ میکند و هسته دوم هر دو ثانیه یک عدد فرد را چاپ میکند.
from time import sleep import _thread def core0_thread(): counter = 0 while True: print(counter) counter += 2 sleep(1) def core1_thread(): counter = 1 while True: print(counter) counter += 2 sleep(2) second_thread = _thread.start_new_thread(core1_thread, ()) core0_thread()
وسایل مورد نیاز
رزبری پای پیکو Raspberry Pi PICO
جمع بندی لیدی پای
میکروپایتون به نسبت زبان جدیدی است و اگر بخواهیم عمیق تر به لایه های آن نفوذ کنیم نیاز به تمرین و صبوری دارد. بسیاری از مفاهیم جدید است و تماما وابسته به کلاس ها و متدها است تا بتوانیم به درستی از آن ها استفاده کنیم. در این آموزش به معرفی thread و مفهوم آن در Micropython با حل مثال پرداختیم که قطعا لازم و کافی نیست و بایستی ارتقا داده شود. رزبری پای پیکو دو هسته ای است و حالا میتوانیم با یادگیری ترد thread برای هر هسته یک تسک جدا تعریف کنیم که بدون دخالت در کارهای یکدیگر هر تسک به درستی اجرا شود و تاثیری در عملکرد یکدیگر نداشته باشند.
بسیار مبحث سنگین و پیچیده ای هست از اینکه در دیجی اسپارک به این تاپیک پرداخته شده است، بی نهایت ممنونم
با سلام
سپاس از همراهی شما کاربر گرامی
امیدوارم مفید واقع شده باشد.
مزیت استفاده از ترد در میکروپایتون چیه استاد؟
سلام
ترد در میکروپایتون میتواند برای کاربردهای مختلفی مفید باشد. برای مثال، میتوان از تردها برای انجام عملیاتهای بلوکه کننده استفاده کرد. در این حالت، اگر برنامه در حال اجرا کردن یک کد بلوکه کننده باشد، ترد دیگری میتواند برای انجام دیگر کارها راهاندازی شود و برنامه به صورت همزمان و بهینهتر اجرا شود.