تردکاری
فایل
functions.pyرا داور فراهم میکند، پسfrom functions import f, g, hهمانطور که در صورت سؤال آمده کار میکند. داور ثبت میکند هر تابع روی کدام ترد و به چه ترتیبی اجرا شد.
در سیستمهای کامپیوتری مدرن، بهویژه در پردازشهای سنگین مانند گرافیک یا محاسبات علمی، برای افزایش سرعت اجرا، وظایف (tasks) به صورت همروند یا موازی اجرا میشوند. وابستگی بین این taskها اغلب به شکل یک گراف جهتدار نمایش داده میشود، جایی که یک task ممکن است برای شروع، به پایان رسیدن taskهای دیگر نیاز داشته باشد. در این تمرین، ما با یک نمونه ساده از این نوع وابستگیها کار میکنیم و این taskها را بهصورت همروند و با رعایت ترتیب وابستگیها اجرا میکنیم.
در این تمرین، مجموعهای از توابع در سه گروه
f،gوhداریم. این توابع وابستگیهای خاصی دارند که میتوان آنها را بهصورت لایهای در نظر گرفت:
- توابع لایهی
fباید قبل از توابع لایهیgاجرا شوند.- توابع لایهی
gباید قبل از توابع لایهیhاجرا شوند.- توابع درون هر لایه میتوانند بهصورت همروند اجرا شوند.
f₁, f₂, f₃, f₄ ↓ g₁, g₂, g₃, g₄ ↓ h₁, h₂, h₃, h₄
هر یال جهتدار در این شکل نشاندهندهی وابستگی است؛ تابعی که یال از آن خارج میشود باید قبل از تابعی که یال به آن وارد میشود، کامل شده باشد.
توابع مورد نظر در لیستهای
f،gوhدر فایلfunctions.pyقرار دارند. برای مثال:
f₁باfunctions.f[0]f₂باfunctions.f[1]- و به همین ترتیب برای سایر توابع در لیستهای
gوh⚠️ نکته: این توابع ورودیای نمیگیرند و تنها با فراخوانی ساده (پرانتز خالی) اجرا میشوند.
شما باید تمام این توابع را با استفاده از تردها اجرا کنید، به گونهای که شرایط زیر رعایت شود:
- توابع باید بهترتیب لایه اجرا شوند: ابتدا تمام توابع لایه
fسپس تمام توابع لایهgدر نهایت تمام توابع لایهh- تمام توابع مربوط به یک لایه (مثلاً
f₁،f₂،f₃وf₄) باید بهصورت همروند آغاز به کار کنند و پیش از شروع لایه بعدی، تمام آنها به پایان رسیده باشند.- برای هر اندیس
i(از 1 تا 4)، اجرای توابعfᵢ،gᵢوhᵢباید توسط یک ترد باnameبرابر با رشتهیstr(i)انجام شود.
💡 راهنمایی ۱: نامگذاری
این به آن معنا نیست که یک ترد مشخص با نام
'1'هر سه تابعf₁،g₁وh₁را به ترتیب اجرا کند. بلکه به این معناست که:
- برای اجرای تابع
f₁از یک ترد با نام'1'استفاده شود.- سپس (پس از اتمام تمام توابع
f) برای اجرای تابعg₁از یک ترد با نام'1'دیگر استفاده شود.- نهایتاً برای اجرای تابع
h₁از یک ترد با نام'1'استفاده شود.⚠️ مهم: مطابقت نام ترد با اندیس تابع در هنگام اجرا است.
شما باید کد خود را در تابعی به نام
threadize()بنویسید. این تابع نیازی به گرفتن ورودی یا برگرداندن خروجی ندارد، صرفاً باید اجرای taskها را مدیریت کند.
💡 راهنمایی ۲: انتظار برای اتمام گروه
برای پیادهسازی انتظار برای اتمام گروهی از تردها قبل از شروع گروه بعدی، از متد
join()برای هر ترد در آن گروه استفاده کنید. پس از فراخوانیstart()برای تمام تردهای یک لایه، یک حلقهی دیگر برای فراخوانیjoin()بر روی همان تردها، اجرای کد را تا پایان یافتن آنها متوقف میکند.
💡 راهنمایی نهایی
ساختار کلی تابع threadize() به این شکل است:
from threading import Thread
from functions import f, g, h
def threadize():
# تابع کمکی برای ایجاد و اجرای تردها
def run_layer(layer_funcs):
threads = []
for i in range(len(layer_funcs)):
t = Thread(target=layer_funcs[i], name=str(i + 1))
t.start()
threads.append(t)
for t in threads:
t.join()
# اجرای لایهها به ترتیب
run_layer(f)
run_layer(g)
run_layer(h)
run_layer← تابع کمکی برای اجرای یک لایه با تردهای موازی- برای هر تابع در لایه، یک ترد با نام برابر با
str(i+1)ایجاد میشود.- همهی تردها با
start()شروع میشوند.- با
join()منتظر اتمام همهی تردهای آن لایه میمانیم.- لایهها به ترتیب
f→g→hاجرا میشوند.
- در این تمرین، نیازی به دریافت ورودی از کاربر یا چاپ خروجی در کنسول ندارید.
- شما فقط باید تابع
threadize()را پیادهسازی کنید.- توابع در
functionsدر پروژه پیادهسازی شدهاند.- نام تردها باید دقیقاً برابر با
'1'،'2'،'3'و'4'باشد.
✅ این تمرین را در ویرایشگر خود پیادهسازی کنید. به یاد داشته باشید که توابع هر لایه باید همروند اجرا شوند و لایهها به ترتیب اجرا گردند.
نمونهها
every task ran exactly once: True each task ran on the thread named after its index: True each layer finished before the next began: True the four tasks of each layer ran at the same time: True
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود